Подходит использование эпсилона машины для тестов равенства с плавающей точкой?

Это - продолжение Тестирования на равенство значения с плавающей точкой: существует ли стандартное имя для постоянной “точности”?.
Существует очень похожий вопрос Double.Epsilon для равенства, больше, чем, меньше, чем, меньше чем или равный, больше, чем или равный.


Известно, что тест равенства для двух X и Y значений с плавающей точкой должен больше походить на это (а не простое =):

брюшной пресс (x - y) <эпсилон  ,  где эпсилон является некоторым очень маленьким значением.

Как выбрать значение для эпсилона?

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

Как пример, платформа.NET предлагает константу System.Double.Epsilon (= 4.94066 × 10-324), который представляет самое маленькое положительное System.Double значение, которое больше, чем нуль.

Однако оказывается, что это конкретное значение не может надежно использоваться в качестве эпсилона с тех пор:

0 + System.Double.Epsilon ≠ 0

1 + System.Double.Epsilon = 1 (!)

который является, если я понимаю правильно, потому что та константа является меньше, чем эпсилон машины.

→ Это корректно?

→ Делает это также означает, что я могу надежно использовать эпсилон: = эпсилон машины для тестов равенства?

Удаленный эти два вопроса, поскольку им уже соответственно отвечают вторым ТАК связанный вопрос - к вышеупомянутому.


Связанный - к статье Wikipedia говорит это для 64-разрядных чисел с плавающей запятой (т.е. double введите на многих языках), эпсилон машины равен:

2-53, или приблизительно 0,000000000000000111 (число с 15 обнуляет после десятичной точки),

→ Это следует из этого, что все 64-разрядные значения с плавающей точкой, как гарантируют, будут с точностью до 14 (если не 15) цифры?

11
задан stakx supports GoFundMonica 14 November 2017 в 12:37
поделиться

2 ответа

Как выбрать значение для эпсилон?

Краткий ответ: Вы выбираете небольшое значение, которое соответствует потребностям вашего приложения.

Длинный ответ: Никто не может знать, какие вычисления выполняет ваше приложение и насколько точными вы ожидаете получить результаты. Поскольку ошибки округления суммируют, машинный эпсилон почти всегда будет слишком большим, поэтому вам нужно выбрать собственное значение. В зависимости от ваших потребностей будет достаточно 0,01 или, возможно, 0,00000000000001 или меньше.

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

11
ответ дан 3 December 2019 в 05:11
поделиться

В прошлом, когда мне приходилось использовать эпсилон-значение, оно было намного больше, чем машинное эпсилон-значение.

Хотя это было для 32-битных удвоений (а не для 64-битных удвоений), мы обнаружили, что эпсилон-значение 10 -6 было необходимо для большинства (если не всех) вычисленных значений в нашем конкретном приложение .

Значение эпсилона, которое вы выбираете, зависит от масштаба ваших чисел. Если вы имеете дело с очень большим (скажем, 10 +10 ), то вам может потребоваться большее значение эпсилон, поскольку ваши значащие цифры не простираются очень далеко в дробную часть ( если вообще). Если вы имеете дело с очень маленьким (скажем, 10 -10 ), то, очевидно, вам нужно эпсилон-значение, которое меньше этого.

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

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

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