37,743
社区成员




local i = 18014398509481984 --2^54
local j = i+1
if i > 0 then
XLMessageBox(j)--j的值为18014398509481985
end
if true then return end
如果是这样, 那么j应该变成-18014398509481984才对
反正我测试的是不管多大都能得出正确结果
就跟放在windows计算器程序里面算一样[/quote]
首先抱歉我之前说的有误,double的有效位不是53位而是52位(我刚wiki过),
加上1个隐含位,1个符号位,一共54位,
因此有效其范围是[-2^53, +2^53]
但是我看了楼主的回复,楼主应该是没理解我的意思
所谓的有效范围,是指可以当作整数安全使用的范围,而不等价于54位整数
也就是说超过这个范围后就不能按照整数的方法计算了,因为浮点精度不够
下面这个例子可以说明问题:
local i = 2^53
local j = i + 1
local k = i - 1
print(j - i) -- 2^53 + 1 - 2^53
print(k - i) -- 2^53 - 1 - 2^53
结果是:
0
-1
原因就是2^53+1已经超出了54位整数的有效范围,而2^53-1还在有效范围之内
想要完全弄明白这个事情,需要了解浮点数存储的原理:
http://zh.wikipedia.org/wiki/IEEE_754[/quote]
2^53已经是54位有效数字了,加上符号位,是55位有效数字,这个如何解释?
local i = 18014398509481984 --2^54
local j = i+1
if i > 0 then
XLMessageBox(j)--j的值为18014398509481985
end
if true then return end
如果是这样, 那么j应该变成-18014398509481984才对
反正我测试的是不管多大都能得出正确结果
就跟放在windows计算器程序里面算一样[/quote]
首先抱歉我之前说的有误,double的有效位不是53位而是52位(我刚wiki过),
加上1个隐含位,1个符号位,一共54位,
因此有效其范围是[-2^53, +2^53]
但是我看了楼主的回复,楼主应该是没理解我的意思
所谓的有效范围,是指可以当作整数安全使用的范围,而不等价于54位整数
也就是说超过这个范围后就不能按照整数的方法计算了,因为浮点精度不够
下面这个例子可以说明问题:
local i = 2^53
local j = i + 1
local k = i - 1
print(j - i) -- 2^53 + 1 - 2^53
print(k - i) -- 2^53 - 1 - 2^53
结果是:
0
-1
原因就是2^53+1已经超出了54位整数的有效范围,而2^53-1还在有效范围之内
想要完全弄明白这个事情,需要了解浮点数存储的原理:
http://zh.wikipedia.org/wiki/IEEE_754
local i = 18014398509481984 --2^54
local j = i+1
if i > 0 then
XLMessageBox(j)--j的值为18014398509481985
end
if true then return end
如果是这样, 那么j应该变成-18014398509481984才对
反正我测试的是不管多大都能得出正确结果
就跟放在windows计算器程序里面算一样In [49]: pow(2, 256)
Out[49]: 115792089237316195423570985008687907853269984665640564039457584007913129639936L
In [50]: pow(2, 1024)
Out[50]: 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216L