【问题标题】:Why does lua 5.1 interpret certain integers incorrectly?为什么 lua 5.1 会错误地解释某些整数?
【发布时间】:2018-02-07 17:57:30
【问题描述】:

Lua 5.1 出现将许多完全有效的 64b 整数解释为

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

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

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

这是一个不幸输出的例子:

Lua 5.1.5  Copyright (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

编辑(标记为重复):

这不是 this question 的重复,因为您无法编译 Lua 5.1 来处理 64b 整数。

【问题讨论】:

  • Lua 在 5.3 之前没有整数。这些是 64 位浮点数,如 JavaScript,只能明确表示最大为 2^53−1 的整数。
  • 经典的“这不是错误,而是功能”。感谢您的回复!
  • 嗯,它不是“功能”。这就是他们在 5.3 中修复它的原因。 =)

标签: lua integer


【解决方案1】:

Lua 5.1 使用精度为 53 位的 double 类型。

只有前 53 位数字将存储在双小数部分。 最大有效整数为 9007199254740991。如果数字大于 9007199254740991,则直到 53 位的最后一位将被清零。

54 位数字:

18014398509481983 = 111111111111111111111111111111111111111111111111111111b

内部将存储为

18014398509481982 = 111111111111111111111111111111111111111111111111111110b

因为只使用前 53 位,所以两者相等。

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2012-07-26
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多