【问题标题】:Why Lua and Python factorial output was different为什么 Lua 和 Python 阶乘输出不同
【发布时间】:2017-09-20 18:01:51
【问题描述】:

--t.lua
function fact(n)
    if n == 0 then
        return 1
    else
        return n * fact(n-1)
    end
end

for i=1,100,1 do
    print(i,fact(i))
end
# t.py
fact = lambda n:1 if n == 0 else n * fact(n-1)

for i in range(1, 100):
    print(i, fact(i))

当我在 Lua 和 Python 中编写阶乘代码时,我发现输出不同。

【问题讨论】:

  • 请将输出(和预期输出)作为文本复制粘贴到问题中。这些屏幕截图难以辨认。

标签: python lua


【解决方案1】:

Lua 通常配置使用您平台的常用双精度浮点格式来存储所有数字(这意味着所有数字类型)。对于当今的大多数桌面平台,这将是 64 位 IEEE-754 格式。传统观点是,可以安全地假设 -1E15 到 +1E15 范围内的整数可以精确表示。在 Lua 中处理大数,关键词是“bignum”和“任意精度数”。您可以使用纯 Lua 模块。例如(bignumlua-nums)和基于 C 的模块 lmapm。另请阅读此thread

Python 支持一种众所周知的“bignum”整数类型,它可以处理任意大的数字。在 Python 2.5+ 中,这种类型称为 long 并且与 int 类型分开,但解释器会自动使用更合适的类型。在 Python 3.0+ 中,int 类型已完全删除。在 Python 中,您通常不需要使用特殊工具来处理大量数字。

【讨论】:

  • 有点不准确:"Lua [...使用浮点数...] 来存储所有数字 [...]。" – 从 5.3 开始,Lua 使用浮点数和整数 i>,根据操作需要进行转换(如果您单击 OP 的图片,您会看到环绕的有符号整数)。 (这对解决这个特殊问题并没有真正的帮助,因为它只会将边界从 2^53 移动到 2^64,但它在其他情况下很有价值。)
【解决方案2】:

这是lbn library 库的基本示例

local bn = require "bn"

function bn_fact(n)
  if n:tonumber() == 0 then return 1 end
  return n * bn_fact(n-1)
end

function fact(n)
  return bn_fact(bn.number(n))
end

for i=1,100,1 do
    print(i,fact(i))
end

一些值的输出

30  265252859812191058636308480000000
31  8222838654177922817725562880000000
32  263130836933693530167218012160000000
33  8683317618811886495518194401280000000

【讨论】:

  • module 'bn' not found:, 如何使用 bn 库?我该怎么办?
  • 添加图书馆链接。但是您可以使用任何其他大数字库。
  • @moteus - 为什么你认为 Lua 程序员必须是 C 程序员并且必须能够为他的平台构建 C 库? OP 可能是 Lua/C 新手,构建外部 C 库可能不是一件容易的事。并不是所有的 Lua 环境都允许你使用外部库。
【解决方案3】:

您的第一张图片有溢出,因为值太大而无法存储在该 var 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多