числовая ошибка с плавающей точкой. Откуда c ++ знает, что 0.99999982 равен 1? - PullRequest
1 голос
/ 21 сентября 2011

Я нормализовал вектор и его длина должна быть 1. Но результат метода длины равен 0.99999982

Я не знаю, правильно это или неправильно. Но если я распечатаю, результат будет 1. Не 0.99999982 (напечатано cout)

Но откуда std :: cout знает, что это 1? [Это мой первый вопрос]

И еще один вопрос: почему результат сравнения функции ложен.

У меня есть метод сравнения, как показано ниже. И lhs - длина вектора, а rhs - всего 1.

return (fabsf(rhs-lhs) <= FLT_EPSILON) ? true : false;

Результат этого метода неверен.

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

Что я не так сделал?

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011

Эпсилон слишком мал.Это потому, что эпсилон является наименьшим, как это может быть .(по определению)

Так что вам понадобится больший допуск.

1 голос
/ 21 сентября 2011

Стандарт IEEE требует, чтобы результат сложения, вычитания, умножения и деления был точно округлен.Затем результат должен быть округлен до ближайшего числа с плавающей точкой .Ошибка с плавающей точкой накапливается во многих операторах, необходимых для нормализации вектора.Как и другой автор, FLT_EPSILON слишком маленький.

...