2010-09-16 3 views
9

Я получаю этот фрагмент кода от где-то еще. Согласно веб-мастеру, код выбирается из The art of computer programming by KnuthРазница между приблизительноEqual и по существуEqual в искусстве программирования компьютера

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

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); 
} 

ответ

11

В качестве примера:

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 (наименьшее значение).

+0

Могу ли я сказать, что по существуEqual всегда будет иметь значение 'ближе', чем приблизительно? –

+0

Да, значения 'essenceEqual' всегда будут« ближе », чем значения' приблизительноEqual'. – palswim

+3

Подумайте о предложениях в своем обычном магазине и о том, что там означает процент. Какова более ценная 33% -ная скидка в цене или 33% дополнительного бесплатного продукта? Решение состоит в том, что вы должны отдать предпочтение 33% скидке, так как это эквивалентно 50% бесплатному предложению продукта. То же самое происходит здесь, в зависимости от того, возьмете ли вы эпсилон вокруг большего или меньшего из двух значений, результат будет отличаться. 66,6 примерно равна 100 с 33% эпсилон, но только по существу равна 50% эпсилон. –

9

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

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

У этого есть приложения в вопросах, где у нас есть данные и тарифы «приемлемой ошибки» и т. Д. Этот код просто дает вам алгоритмическое определение этих терминов.

+0

Можете ли вы привести пример реального мира, как мы должны выбрать среди двух функций? –

+0

'Это означает, что значения отличаются меньше допустимой разницы в любом расчете' - если значения отличаются друг от друга, это также означает« достаточно близко »? Итак, что это будет отличаться от 'approxEqual'? –

+0

Вот [медицинская статья] (http://www.pnas.org/content/95/3/811.full), которая использует оба термина. Это не обязательно, как выбирать, но также и то, как вы описываете данные. – palswim

3

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

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

+0

+1 для транзитивного анализа –