大 lua 数字打印不正确
Large lua numbers are being printed incorrectly
我有以下测试用例:
Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> foo = 1000000000000000000
> bar = foo + 1
> bar
1000000000000000001
> string.format("%.0f", foo)
1000000000000000000
> string.format("%.0f", bar)
1000000000000000000
最后一行应该是 1000000000000000001
,因为那是 bar
的值,但由于某些原因它不是。这不仅适用于 1000000000000000000
,我还没有找到另一个给出正确值的数字。谁能解释一下为什么会这样?
您将数字格式化为浮点数,而不是整数。这就是 %.0f
正在做的事情。在某些时候,浮点数会失去精度。 double
,例如,将在大约 16 位小数位后丢失精度。
如果要将整数格式化为整数,则需要将其格式化为整数,使用standard printf
rules:
string.format("%i", bar)
log2(1000000000000000000)
介于59和60之间,也就是说这个数的二进制表示需要60位。 double
精度浮点数只有 53 位精度,加上 11 位范围的二次方指数。因此,为了将这么大的数字存储为浮点数(这是您使用 %f
格式说明符所请求的),六到七位精度从数字的末尾切掉,整个数字乘以2 的幂使其回到范围内(我认为在这种情况下为 259)。砍掉那些最后的位会消除允许 1000000000000000000
和 1000000000000000001
彼此不同的精度。
(这不是对浮点数的特别精确的描述,如果我的数字或描述不准确,请见谅。)
我有以下测试用例:
Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> foo = 1000000000000000000
> bar = foo + 1
> bar
1000000000000000001
> string.format("%.0f", foo)
1000000000000000000
> string.format("%.0f", bar)
1000000000000000000
最后一行应该是 1000000000000000001
,因为那是 bar
的值,但由于某些原因它不是。这不仅适用于 1000000000000000000
,我还没有找到另一个给出正确值的数字。谁能解释一下为什么会这样?
您将数字格式化为浮点数,而不是整数。这就是 %.0f
正在做的事情。在某些时候,浮点数会失去精度。 double
,例如,将在大约 16 位小数位后丢失精度。
如果要将整数格式化为整数,则需要将其格式化为整数,使用standard printf
rules:
string.format("%i", bar)
log2(1000000000000000000)
介于59和60之间,也就是说这个数的二进制表示需要60位。 double
精度浮点数只有 53 位精度,加上 11 位范围的二次方指数。因此,为了将这么大的数字存储为浮点数(这是您使用 %f
格式说明符所请求的),六到七位精度从数字的末尾切掉,整个数字乘以2 的幂使其回到范围内(我认为在这种情况下为 259)。砍掉那些最后的位会消除允许 1000000000000000000
和 1000000000000000001
彼此不同的精度。
(这不是对浮点数的特别精确的描述,如果我的数字或描述不准确,请见谅。)