Дважды. Эпсилон для равенства, больше, чем, меньше, чем, меньше чем или равный, больше, чем или равный

http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

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

Таким образом, это не действительно эпсилон, который мог использоваться для сравнений? Я действительно не понимаю формулировку MSDN.

Это может использоваться в качестве эпсилона в примерах здесь? - Каков самый эффективный путь к плаванию и двойному сравнению?

И наконец это кажется действительно важным, таким образом, я хотел бы удостовериться, что у меня есть серьезная реализация для равенства, больше, чем, меньше, чем, меньше чем или равный, и больше, чем или равный.

52
задан Community 23 May 2017 в 02:18
поделиться

7 ответов

Я не знаю, что они курили, когда писали это. Double.Epsilon - это наименьшее представимое неденоминальное значение с плавающей точкой, которое не равно 0. Все, что вы знаете, это то, что, если есть ошибка усечения, она всегда будет больше, чем это значение. Намного больше.

Тип System.Double может представлять значения с точностью до 15 цифр. Поэтому простая оценка первого порядка, если двойное значение x равно некоторой константе, заключается в использовании эпсилона константы * 1E-15

public static bool AboutEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

Нужно быть осторожным, но ошибки усечения могут накапливаться. Если и x, и y - вычисленные значения, то нужно увеличить эпсилон.

76
ответ дан 7 November 2019 в 09:05
поделиться

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

1
ответ дан 7 November 2019 в 09:05
поделиться

Я хотел бы убедиться, что у меня есть надежная реализация равенства, больше, меньше, меньше чем или равно, и больше или равно.

Вы используете двоичную арифметику с плавающей запятой.

Двоичная арифметика с плавающей запятой была разработана для представления физических величин, таких как длина, масса, заряд, время и т. Д.

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

Измерения физических величин всегда имеют определенную точность, в зависимости от точности устройства, используемого для их измерения.

Поскольку вы предоставляете значения для величин, которыми вы манипулируете, вы тот, кто знает, каковы «планки ошибок» для этой величины. Например, если вы указываете величину «высота здания 123,56 метра», то вы знаете, что это с точностью до сантиметра, но не до микрометра.

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

Итак, теперь у нас есть ответ на ваш вопрос. Что вы должны сделать, так это отслеживать, в чем ошибка каждого количества; например, высота здания составляет «0,01–123,56 метра», потому что вы знаете, насколько точны измерения. Если затем вы получите другое измерение, равное 123,5587, и хотите узнать, являются ли два измерения «равными» в пределах допусков ошибок, выполните вычитание и посмотрите, попадает ли оно в пределы допуска ошибок. В данном случае это так. Если измерения действительно были точны до микрометра, то они не равны.

Вкратце: вы единственный человек здесь, который знает, что такое разумная допустимая погрешность, потому что вы единственный человек, который знает, откуда в первую очередь взялись цифры, которыми вы манипулируете. ВНИМАНИЕ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Используйте любой допуск на погрешность, который имеет смысл для ваших измерений, учитывая точность оборудования, которое вы использовали для его изготовления.

45
ответ дан 7 November 2019 в 09:05
поделиться

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

Я не понимаю, почему .NET framework не определяет что-то вроде

bool IsApproximatelyEqual(double value, double permittedVariance);

.

4
ответ дан 7 November 2019 в 09:05
поделиться

Я думаю, что уместные биты в опубликованной вами ссылке MSDN следующие:

Однако свойство Epsilon не является общей мерой точности { {1}} двойной тип; он применяется только к экземплярам Double , которые имеют нулевое значение.

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

Это значение не определяется как наименьшее положительное число x, такое, что x + 1.0 не равно 1.0, поэтому Double.Epsilon не может использоваться для "почти равенство ". В структуре не существует константы, значение которой является наименьшим положительным числом x, такой что x + 1.0 не равно 1.0.

Должен сказать, это меня удивляет. Я тоже предполагал, что Double.Epsilon был эквивалентом DBL_EPSILON в c / c ++ - явно нет!

Судя по тому, что я могу прочитать об этой ссылке, кажется, что там говорится: «Вам нужно самому определить достойную ценность для сравнений», что, мягко говоря, довольно удивительно.
Возможно, кто-то более знающий сможет уточнить:)

3
ответ дан 7 November 2019 в 09:05
поделиться

Если у вас есть два двойных значения, которые близки к 1.0, но они отличаются только наименьшими значащими битами, то разница между ними будет на много порядков больше, чем Double.Epsilon. На самом деле, разница составляет 324 десятичных порядка величины. Это объясняется влиянием экспоненты. Double.Epsilon имеет огромную отрицательную экспоненту, в то время как 1.0 имеет экспоненту, равную нулю (после удаления смещений, конечно).

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

Если двойные значения, которые вы сравниваете, близки к 1,0. Тогда значение наименьшего значащего бита будет около 0,00000000000000000001. Если сравниваемые двойные значения исчисляются квадриллионами, то значение наименьшего значащего бита может достигать тысячи. Ни одно значение эпсилона не может быть использовано для сравнения равенства в обоих этих случаях.

9
ответ дан 7 November 2019 в 09:05
поделиться

Вот некоторый код, который дважды включен в набор средств управления Silverlight:

    public static bool AreClose(double value1, double value2)
    {
        //in case they are Infinities (then epsilon check does not work)
        if(value1 == value2) return true;
        // This computes (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON
        double eps = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * DBL_EPSILON;
        double delta = value1 - value2;
        return(-eps < delta) && (eps > delta);
    }

В одном месте они используют 1e-6 для epsilon; в другом они используют 1.192093E-07. Вы захотите выбрать свой собственный эпсилон.

0
ответ дан 7 November 2019 в 09:05
поделиться
Другие вопросы по тегам:

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