为什么 Lua 5.1 会错误地解释某些整数?

Lua 5.1 看起来会将许多完全有效的 64 位整数解释为

1,805,996,217,335,808,768

而最大的有效的有符号 64 位整数是

9,223,372,036,854,775,807

以下是不幸的输出示例:

Lua 5.1.5  版权所有 (C) 1994-2012 Lua.org, PUC-Rio
> return 1805996217335808768 == 1805996217335808804
true
> return 1805996217335808768 == 1805996217335808805
true
> return 1805996217335808768 == 1805996217335808806
true
> return 1805996217335808768 == 1805996217335808769
true
> return 1805996217335808768 == 1805996217335808767
true

人们希望在这里看到 false,但却出现了 true

编辑(标记为重复):

这并不是 这个问题 的重复,因为你不能编译 Lua 5.1 来处理 64 位整数。

点赞
用户12918181
用户12918181

Lua 5.1使用双精度浮点型,精度为53个比特。

一个数字的前53个比特位将被储存在浮点数的小数部分。 最大的有效整数是9007199254740991。如果数字大于9007199254740991,则最后的比特位直到53位将变为0。

54位的数字:

18014398509481983 = 111111111111111111111111111111111111111111111111111111b

在内部存储时会变成:

18014398509481982 = 111111111111111111111111111111111111111111111111111110b

因为只有前53个比特位被使用,所以两个数字是相等的。

2020-02-19 11:32:43