Скажем, у меня есть код, который выполняет некоторую арифметику с плавающей запятой и сохраняет значения в двойниках. Поскольку некоторые значения не могут быть представлены идеально в двоичном формате, как я могу проверить равенство с разумной степенью уверенности?
Как определить, что означает "разумный"?
Может ли double.Epsilon
использоваться каким-то образом?
Обновление
Пара вещей. Как отмечалось в @ho1, в документации для double.Epsilon
указано, что, когда дело доходит до сравнения двух удвоений для равенства, вы, вероятно, захотите получить значение, намного большее, чем epsilon. Вот соответствующий абзац из документации:
Два явно эквивалентных числа с плавающей запятой могут не сравниться одинаковыми из-за различий в наименее значимых цифрах. Например, выражение С# (double) 1/3 == (double) 0.33333 не сравнивается с равным, поскольку операция деления на левой стороне имеет максимальную точность, а константа справа - точная только с указанными цифрами. Если вы создадите собственный алгоритм, определяющий, можно ли считать, что два числа с плавающей запятой считаются равными, вы должны использовать значение, большее, чем константа Epsilon, чтобы установить приемлемый абсолютный запас разницы для того, чтобы два значения считались равными. (Как правило, этот разницы во много раз больше, чем Epsilon.) - http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
... но вопрос в том, сколько раз больше?
В случае, если это повлияет на ваш ответ, моя конкретная ситуация связана с геометрическими вычислениями (такими как точечные продукты и кросс-продукты с использованием точек и векторов). В некоторых случаях вы делаете разные выводы на основе A == B
, A > B
или A < B
, поэтому я ищу хорошее правило для определения размера окна эквивалентности.