为什么2不等于√2*√2?

Dav*_*vid 2 math floating-point lua sqrt

据Lua说,我注意到了 2 ~= math.sqrt(2) ^ 2

print(2 == math.sqrt(2) ^ 2) --> false
print(2, math.sqrt(2) ^ 2) --> 2  2
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Yu *_*Hao 8

大多数浮点数不能精确地存储在Lua的数字类型中(double默认为C ).math.sqrt(2)是其中之一.

如果你试试:

print(2 - math.sqrt(2) ^ 2)
Run Code Online (Sandbox Code Playgroud)

输出:-4.4408920985006e-016这是一个非常小的数字,但仍然使两个数字不完全相同.


这种浮点精度问题不仅存在于Lua中,还存在于许多其他语言中.正如@Thilo评论的那样,在比较实践中的平等时,你可以使用一个小的"delta".您可能会对以下内容感兴趣:C FAQ:检查"足够接近"浮点相等性的好方法是什么?.