Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 第一天lua-被for循环弄糊涂了_Variables_For Loop_Lua_Int - Fatal编程技术网

Variables 第一天lua-被for循环弄糊涂了

Variables 第一天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在特定语言中的存储方

非常简单的问题,但我真的很困惑: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在特定语言中的存储方式

这已经得到了答复


正如@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中的to
0.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