我正在研究向量类。在测试向量类时,在将单位向量的大小与1进行比较时遇到了一个失败的测试案例。
在比较它们时,它们看起来都为1
,那么什么导致该测试失败?
我已尽最大努力找出问题的根本原因。我可以将数字转换为字符串并进行比较,但这只会解决测试用例,使问题稍后再次出现。 我正在使用与LuaRocks捆绑在一起的Lua 5.1解释器(以确定根本原因)。
local v = 0.70710678118655^2 + 0.70710678118655^2
print(v, v == 1)
v == 1
应该是true
,而不是false
。
答案 0 :(得分:1)
当将浮点数转换为字符串时,Lua会四舍五入为仅15个有效数字。尝试将其设置为17位以获得准确的表示形式。
local v = 0.70710678118655^2 + 0.70710678118655^2
print(("%.17g"):format(v), v == 1)
输出:
1.0000000000000071 false
答案 1 :(得分:0)
当然,这是Is floating point math broken的说明。
更多说明:执行此代码
local half = 0.50
local doubleHalf = half + half
if doubleHalf == 1 then
print('doubleHalf is one')
else
print('doubleHalf differs '.. doubleHalf - 1 ..'from one')
end
--> doubleHalf is one
local rootHalf = math.sqrt(half)
print('rootHalf is a '.. type(rootHalf) ..' with value', rootHalf)
--> rootHalf is a number with value 0.70710678118654
local square = rootHalf^2
print('square is a '.. type(square) ..' with value', square)
--> square is a number with value 0.5
if square == half then
print('square is half')
else
print('square differs '.. square - half ..' from half')
end
--> square differs 1.110223E-16 from half
vector_length = square + square
if vector_length == 1 then
print('vector length is one')
else
print('vector length differs '.. vector_length - 1 ..' from one')
end
--> vector length differs 2.220446E-16 from one
任何使用值的计算机都会以有限的精度进行计算。