为什么Lua和Python的阶乘输出结果不同?

enter image description here

--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写阶乘代码时,我发现输出结果不同。

点赞
用户2397315
用户2397315

你的第一张图像出现了溢出错误,因为值太大以至于无法存储在该变量中。

2017-09-20 09:23:23
用户3824945
用户3824945

Lua 通常配置为使用您平台的双精度浮点数格式来存储所有数字(这意味着所有数字类型)。对于今天的大多数桌面平台,它将是 64 位 IEEE-754 格式。传统的智慧认为,范围在 -1E15 到 +1E15 的整数可以安全地假定被准确表示。为了处理 Lua 中的巨大数字,关键词是“bignum”和“任意精度数字”。您可以使用纯 Lua 模块,例如 bignumlua-nums,以及 C-based 模块 lmapm。还应该阅读这个 线程

Python 支持一种被称为“bignum”的已知整数类型,可以处理任意大的数字。在 Python 2.5+ 中,此类型称为“long”,并且与“int”类型分开,但解释器将自动使用最合适的类型。在 Python 3.0+ 中,完全删除了“int”类型。通常情况下,在 Python 中您不需要使用特殊工具来处理巨大的数字。

2017-09-20 09:25:27
用户2328287
用户2328287

这是一个基本示例,使用 lbn

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
2017-09-20 09:43:26