无法将计算出的数字与身份证号码进行比较?

时间:2019-06-20 03:14:08

标签: lua luarocks

我正在研究向量类。在测试向量类时,在将单位向量的大小与1进行比较时遇到了一个失败的测试案例。

在比较它们时,它们看起来都为1,那么什么导致该测试失败?

我已尽最大努力找出问题的根本原因。我可以将数字转换为字符串并进行比较,但这只会解决测试用例,使问题稍后再次出现。 我正在使用与LuaRocks捆绑在一起的Lua 5.1解释器(以确定根本原因)。

local v = 0.70710678118655^2 + 0.70710678118655^2
print(v, v == 1)

v == 1应该是true,而不是false

2 个答案:

答案 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

任何使用值的计算机都会以有限的精度进行计算。