Невозможно сравнить рассчитанное число с идентификатором? - PullRequest
1 голос
/ 20 июня 2019

Я работаю над векторным классом.При тестировании векторного класса я столкнулся с неудачным тестовым примером при сравнении величины единичного вектора с 1.

При сравнении их оба выглядят как 1, так что может послужить причиной этого тестасбой?

Я вырезал как можно больше, чтобы выяснить причину проблемы.Я мог бы просто привести числа к строкам и сравнить их, но это только исправило бы контрольный пример, что позволило бы проблеме снова появиться позже.Я использую интерпретатор Lua 5.1 (для определения основной причины), в комплекте с LuaRocks.

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

v == 1 должно быть true, а не false.

Ответы [ 2 ]

1 голос
/ 21 июня 2019

При преобразовании числа с плавающей точкой в ​​строку Lua округляет до 15 значащих цифр. Попробуйте получить 17 цифр, чтобы получить точное представление.

local v = 0.70710678118655^2 + 0.70710678118655^2
print(("%.17g"):format(v), v == 1)

Выход:

1.0000000000000071  false
0 голосов
/ 20 июня 2019

Конечно, это пример из Не работает ли математика с плавающей запятой .

Для более подробного объяснения: выполните этот код

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

Любой компьютер, работающий со значениями, будет рассчитывать с ограниченной точностью.

...