lua里面number变量的边界值是多少

wumn29 2013-08-22 06:12:13
没有找到lua的讨论区, 就写在这吧
在lua里面做数字加法运算, 超过百万级的数字都能算出正确结果, 貌似没有越界问题, 很奇怪哦
...全文
6367 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lookupheaven 2014-09-25
  • 打赏
  • 举报
回复
引用 5 楼 axx1611 的回复:
[quote=引用 3 楼 wumn29 的回复:] [quote=引用 2 楼 axx1611 的回复:] lua使用double类型,故有53个有效位,外加一个隐含位,一个符号位,共55位 也就是[-2^54, +2^54]

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位有效数字,这个如何解释?
axx1611 2013-08-26
  • 打赏
  • 举报
回复
引用 3 楼 wumn29 的回复:
[quote=引用 2 楼 axx1611 的回复:] lua使用double类型,故有53个有效位,外加一个隐含位,一个符号位,共55位 也就是[-2^54, +2^54]

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
axx1611 2013-08-23
  • 打赏
  • 举报
回复
lua使用double类型,故有53个有效位,外加一个隐含位,一个符号位,共55位 也就是[-2^54, +2^54]
wumn29 2013-08-23
  • 打赏
  • 举报
回复
引用 1 楼 panghuhu250 的回复:
百万级,10^6,不算大,32位的整数就有2^31(一位留给正负号),大约是2*10^9。lua内部支持的数只有浮点数,可以精确存储上至10^15的整数(http://www.lua.org/pil/2.3.html)。 还有一些语言支持任意精度的整数计算。例如:
In [49]: pow(2, 256)
Out[49]: 115792089237316195423570985008687907853269984665640564039457584007913129639936L

In [50]: pow(2, 1024)
Out[50]: 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216L
说错了, 是百亿级
wumn29 2013-08-23
  • 打赏
  • 举报
回复
引用 2 楼 axx1611 的回复:
lua使用double类型,故有53个有效位,外加一个隐含位,一个符号位,共55位 也就是[-2^54, +2^54]

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计算器程序里面算一样
panghuhu250 2013-08-22
  • 打赏
  • 举报
回复
百万级,10^6,不算大,32位的整数就有2^31(一位留给正负号),大约是2*10^9。lua内部支持的数只有浮点数,可以精确存储上至10^15的整数(http://www.lua.org/pil/2.3.html)。 还有一些语言支持任意精度的整数计算。例如:
In [49]: pow(2, 256)
Out[49]: 115792089237316195423570985008687907853269984665640564039457584007913129639936L

In [50]: pow(2, 1024)
Out[50]: 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216L

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧