Добро пожаловать в мир ловушек, капканов и бойницами. Как упоминалось в другом месте, решение общего назначения для равенства и допусков с плавающей точкой составляет , а не. Учитывая это, есть инструменты и аксиомы, которые программист может использовать в отдельных случаях.
fabs(a_float - b_float) < tol
имеет недостаток ОП, упомянутый: «не подходит для общего случая, когда a_float может быть очень маленьким или может быть очень большим». fabs(a_float - ref_float) <= fabs(ref_float * tol)
намного лучше справляется с вариантами.
OP «Число одинарной точности с плавающей точкой является использование тол = 10E-6» немного радужными C и C++, так легко продвигать float
арифметику double
, а затем это «толерантность» в double
, не float
, который входит в играть. Рассмотрим float f = 1.0; printf("%.20f\n", f/7.0);
Так много новых программистов не понимают, что 7.0
вызвал точный расчет double
. Рекомендуйте использовать double
, хотя ваш код за исключением случаев, когда для больших объемов данных требуется меньший размер float
.
C99 предоставляет nextafter()
, который может быть полезен для определения «толерантности». Используя его, можно определить следующее представимое число. Это поможет с OP "...полное число значащих цифр для типа хранения минус один ... для обеспечения ошибки округления.»if ((nextafter(x, -INF) <= y && (y <= nextafter(x, +INF))) ...
вида из tol
или„терпимость“используется часто суть дела. Чаще всего (ИМХО) а относительной толерантность важна., например, «Являются ли х и у в пределах 0,0001%»? Иногда нужна абсолютной толерантности., например, «Являются ли х и у в 0,0001»?
значение от допуска часто бывает спорным, поскольку наилучшее значение часто зависит от ситуации. Сравнение в пределах 0,01 может работать для финансовой заявки на доллары, но не иены. (Подсказка:. Обязательно использовать стиль кодирования, который позволяет легко обновления)
Вы читали [это] (http://en.wikibooks.org/wiki/Floating_Point/Epsilon)? – NINCOMPOOP
Если вам нужна совершенная точность, вы можете использовать одну из библиотек рациональных номеров. –
Вопрос: Как правильно вычислять 'tol' для всех общих случаев? A: Никто этого не делает. Такое сравнение не подходит для всех случаев, независимо от допустимого значения (и FWIW, вы не знаете, что лучше всего подходит для того, что вы тестируете *?) –