Это корректно для сравнения двух округленных чисел с плавающей точкой с помощью == оператор?

В документе:

Возвращает изображение в градациях серого, где каждый пиксель обозначает, насколько соседство этого пикселя соответствует шаблону

blockquote>

. порог для res, если нет сходства в изображении, он ничего не делает.

res = cv2.matchTemplate(img,template,method)
if res<0.8:
    return
...

Так же, как в Шаблон соответствия с несколькими объектами

6
задан hakre 8 May 2013 в 13:05
поделиться

6 ответов

Вот обновленный сайт, который обсуждает за и против нескольких методов сравнения чисел с плавающей точкой. (Можно все еще просмотреть старый сайт здесь.)

Метод, с которым я пошел бы, является методом "относительной погрешности". Найдите различие между этими двумя числами, преобразуйте это в процент чисел, и если тот процент является достаточно небольшим, то у Вас есть равенство.

12
ответ дан 8 December 2019 в 05:24
поделиться

Это никогда не корректно для использования == с с плавающей точкой.

Что действительно "усекает" средний в контексте с плавающей точкой? Какую определенную библиотечную функцию Вы называете? Каков результат? Что заставляет Вас полагать, что "усеченные" значения больше сопоставимы, чем неусеченные значения?

Плавающая точка является приближением десятичных значений. Плавающая точка может только представить полномочия два точно. Все другие значения подвергаются некоторой ошибке, какие операции с плавающей точкой Вы делаете.

Если, однако, Вы преобразовываете в целое число, можно использовать ==.

2
ответ дан 8 December 2019 в 05:24
поделиться

Это может все еще перестать работать из-за нормальных проблем с представлением с плавающей точкой. Вместо того, чтобы усекать их, используйте дельту, которая представила бы эквивалентную точность.

Это может перестать работать в случаях, где у Вас есть два плавания, что Вы обычно рассматривали бы то же,

10.19999999

10.20000001

но когда Вы усекаете их, они дают различные результаты.

10.19

10.20

Принимая во внимание, что, если бы я использовал дельту 0,001 для сравнения с различием, я видел бы, что эти два значения являются эффективно тем же.

4
ответ дан 8 December 2019 в 05:24
поделиться

Если Ваше абсолютное значение является меньше, чем 2^23 для сингла, или 2^52 для двойного можно использовать вокруг () и затем сделать сравнивание. Большие значения не могут быть сохраненным precisly, и это открывается для ситуаций где N == N+1.

-1
ответ дан 8 December 2019 в 05:24
поделиться

Еще хуже то, что иногда, даже для того же самого числа, это перестанет работать. Это вызвано тем, что некоторые компиляторы или процессоры будут использовать больше битов точности в регистре ЦП, чем в памяти (MSVC имеет 3 различных опции поведения с плавающей точкой, например). Таким образом недавно вычисленное значение не может иметь этих усеченных битов и, будет казаться, будет неравно. НИКОГДА не используйте == на плаваниях.

5
ответ дан 8 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: