2014-02-11 4 views
0

Я пытаюсь сравнить два поплавка для больше или равно и меньше или равно. Следующий код позволяет мне измерять равенство (true или false). Мне нужно измерить> = и < =. Я понимаю, что сравнение поплавков - проблема на любом языке. Я попытался найти предыдущие вопросы по этому поводу. Все, что я мог найти, это сравнение только для равенства. Какие-либо предложения?Как сравнить плавающие точки за пределами простого равенства в perl

#!/usr/bin/perl 

my $a = 0.0; 
my $b = 0.1; 

if (abs($a - $b) < 0.0000001){ 
    print "True\n"; 
} 
else{ 
    print "False\n"; 
} 
+0

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

ответ

1
if ($a > $b - tolerance) ... # $a >= $b 
if ($a < $b + tolerance) ... # $a <= $b 

EDIT: Это безопаснее сказать

if ($a - $b > -tolerance) ... # $a >= $b 
if ($a - $b < tolerance) ... # $a <= $b 
+0

Есть ли какая-то практическая разница между '$ a <$ b + tolerance' и' $ a - $ b

+2

@mpapec: Да. Если '$ b >> толерантность', то, возможно,' $ b + tolerance == $ b', и сравнение терпит неудачу, когда оно должно было пройти. Обновлен мой ответ. – mob

+0

В этих тестах неверно сообщается, является ли число, которое '$ a' предназначено для представления (если оно было рассчитано с помощью точной математики), больше или равно числу, которое предполагается' $ b', или вице- наоборот. Невозможно достоверно вычислить правильный результат из данных, содержащих числовые ошибки. Если вместо этого «терпимость» была рассчитана окончательно, и тесты были изменены на «$ a - $ b> допуск» и «$ a - $ b <-tolerance», тогда он мог хотя бы правильно дать один из ответов «a определенно больше b "," a определенно меньше b "или" неубедительно ". –

4

Сценарий вы спрашиваете о том, что у вас есть два числа, $a и $b, которые являются значения, которые вы вычислили, пытаясь вычислить некоторые точные математические значения a и b. Однако, поскольку любая численная арифметика имеет ошибки в вычислении, значения $a и $b содержат ошибки, которые (возможно) делают их отличными от a и b. Затем, учитывая только $a и $b, вы хотите определить взаимосвязь между a и b.

Правило здесь - мусор, мусор. Когда у вас есть номера, содержащие ошибки, есть ограниченные вещи, которые вы можете сделать с ними. Вы не можете точно определить отношения.

Сколько может $a отличается от a? Сколько может $b отличается от b? На этот вопрос нет общего ответа. Это зависит от того, какие расчеты вы выполняли, чтобы получить эти значения и какие числа были задействованы. Ошибки могут варьироваться от нуля до бесконечности или могут давать вам нечисловые (NaN) результаты. Определение того, насколько может быть ошибка, чрезвычайно специфично для приложений. Никакой ответ не может быть предоставлен без подробностей о выполняемых вами вычислениях.

После того, как вы подсчитали, сколько ошибок может быть, что вы с ним сделаете? Количество ошибок говорит вам, сколько «slop» может быть в $a и $b. Если $a и $b отличаются более чем на величину отклонений, вы можете быть уверены, что a и b, безусловно, разные. Но если $a и $b находятся в пределах этого расстояния, что вы можете сказать?

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

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

Таким образом, ответ, который будет задан, когда правильный ответ не может быть определен, зависит от вашего приложения.

Смежные вопросы