Variables 第一天lua-被for循环弄糊涂了
非常简单的问题,但我真的很困惑:pVariables 第一天lua-被for循环弄糊涂了,variables,for-loop,lua,int,Variables,For Loop,Lua,Int,非常简单的问题,但我真的很困惑:p > for x = 0, 5, 0.2 do print (x) end 这个循环只计算到4.8 (如果再加上0.2,结果正好是5,不是吗?) 但以下for循环计数为5 > for x = 0, 5, 1 do print (x) end 有人可以解释或参考手册,这些输出背后的原因。也许我应该将变量定义为float?像往常一样,当在任何语言中使用float/double时,您会遇到一些奇怪的事情,搜索float/double在特定语言中的存储方
> for x = 0, 5, 0.2 do
print (x)
end
这个循环只计算到4.8
(如果再加上0.2,结果正好是5,不是吗?)
但以下for循环计数为5
> for x = 0, 5, 1 do
print (x)
end
有人可以解释或参考手册,这些输出背后的原因。也许我应该将变量定义为float?像往常一样,当在任何语言中使用float/double时,您会遇到一些奇怪的事情,搜索float/double在特定语言中的存储方式 这已经得到了答复
正如@jbr已经指出的,0.2存储为
0.200000000001110223024625165404236316680908203125000000
,当for循环运行时,它检查值是否小于或等于5,并且因为这些双精度的总和稍微大于5,它不会将它解释为这个循环的一员,并立即退出。您在这里遇到的是很多人在Lua中感到困惑的事情。在Lua中,所有数字都是双精度的,这意味着并非所有数字都有精确的表示,0.2
是这些数字之一:
> print(string.format("%1.64f",math.abs(0.2)))
0.2000000000000000111022302462515654042363166809082031250000000000
所以这里得到的是一个累积误差
如果您尝试0.25
:
> print(string.format("%1.64f",math.abs(0.25)))
0.2500000000000000000000000000000000000000000000000000000000000000
所以
按照预期工作,有关更多信息,请参阅Lua未能评估math.abs(29.7-30)
此数值
for
循环将步骤0.2
添加到初始值0
,进行处理(print(x)
),直到值为Lua通常以格式表示数字(“通常”因为表示实际上取决于底层的C实现)。二进制64中的to0.2
为0x3FC9999999a
,或约为0.2000000000000000011102230246252
在进行计算之前,源代码中的0.2
将四舍五入到此数字
由于0.2000000000011102230246252
大于2
,因此在最后一步中,该数字将大于5
,因此循环结束于大约4.8
Lua只有一种数字类型,默认情况下为双精度-也就是说,添加的整数支持是即将发布的版本计划的主要功能之一。@ComicSanms,很高兴知道。当Lua5.3发布:)@ComicSansMS时,我会记得回到这里修改答案,只要它比他们喜欢在嵌入式端口上安装的horid“Lua Number”补丁工作得更好*抖动*,它试图将数字强制转换为一对隐藏类型中的一个,但并不总是有效,产生了奇怪的错误消息。有关浮点数字的详细但温和的解释,请参阅David Goldberg。
for x = 0, 5, 0.25 do
print(x)
end
for x = 0, 5, 0.2 do print (x) end