Разница между примерно равным и по существу равным в искусстве программирования - PullRequest
11 голосов
/ 16 сентября 2010

Я получил этот фрагмент кода откуда-то еще.По словам веб-мастера, код взят из Искусство компьютерного программирования от Кнута

Поскольку у меня нет копии этой книги, могу я узнать, в чем разница между этими двумяфункции?

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

Ответы [ 3 ]

14 голосов
/ 16 сентября 2010

Для примера:

double a = 95.1, b = 100.0;
assert( approximatelyEqual( a, b, 0.05 ) );
assert( !essentiallyEqual( a, b, 0.05 ) );

То есть, с эпсилоном 5%, 95,1 - приблизительно 100, так как он находится в пределах 5% от значения 100 (наибольшее). С другой стороны, 95,1 - это, по сути, не 100, поскольку 100 не находится в пределах 5% -ной разницы от 95,1 (наименьшее значение).

10 голосов
/ 16 сентября 2010

approximatelyEqual указывает, меньше ли разница между a и b, чем допустимая ошибка (epsilon), определяемая большим значением a или b. Это означает, что эти два значения «достаточно близки», и мы можем сказать, что они приблизительно равны.

essentiallyEqual показывает, меньше ли разница между a и b, чем допустимая ошибка (epsilon), определяемая меньшим из a или b. Это означает, что значения отличаются меньше, чем допустимая разница в любом расчете, так что, возможно, они на самом деле не равны, но они «по существу равны» (учитывая epsilon).

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

4 голосов
/ 16 сентября 2010

Разница в том, что существенное равенство подразумевает приблизительное равенство, а не наоборот. Таким образом, существенное равенство сильнее, чем приблизительное равенство.

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

...