Шаг 73.
Операции отношения. Числовые операции отношения

    На этом шаге мы рассмотрим особенности использования числовых операций отношения.

    Числовые операции отношения применяются к числовым данным, причем один или оба операнда могут задаваться строкой, содержащей правильное десятичное число. Если в числовых операциях отношения какой-либо из операндов задан строкой, содержимое которой не представляет правильное десятичное число, то его значение принимается равным 0 и отображается предупреждение о некорректном использовании операнда в числовой операции отношения (если включен режим отображения предупреждений интерпретатора Perl). Смысл операций отношения для числовых данных соответствует обычным математическим операциям сравнения чисел:

  123 > 89;  # Результат: 1 (истина)
  123 < 89;  # Результат: "" (ложь)
  123 == 89; # Результат: "" (ложь)
  123 != 89; # Результат: 1 (истина)
  89 <= 89;  # Результат: 1 (истина)
  23 >= 89;  # Результат: "" (ложь)
  23 <=> 89; # Результат: -1 (правый операнд больше левого)
  89 <=> 23; # Результат: 1 (левый операнд больше правого)

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

#! perl -w
$z = 0.7;
$zz = 10+0.7-10; # Переменная $zz содержит число 0.7
# Печать строки "z равно zz", если равны значения переменных $z и $zz
print "z равно zz\n" if ($z == $zz);
Текст этого примера можно взять здесь.

    При попытке выполнить этот пример мы обнаружим, что наша программа ничего не напечатает. В чем же дело? Разгадка лежит в операторе вычисления значения переменной $zz. При выполнении арифметических операций в результате ошибок округления получается значение 0.699999999999999 (можете вставить оператор печати переменной $zz и убедиться в этом), хотя и близкое к 0.7, но не равное ему в точности. Следовательно, операция сравнения отработала верно!


    Замечание. Не используйте операцию сравнения на равенство вещественных чисел, ее результат может не соответствовать ожидаемому с точки зрения математики. Если необходимо проверить равенство двух вещественных чисел, то лучше сравнивать абсолютное значение их разности с некоторым очень маленьким числом (в зависимости от требуемой точности):
  abs($a-$b) <= 0.00000001;   # Проверка  равенства

    На следующем шаге мы рассмотрим строковые операции отношения.




Предыдущий шаг Содержание Следующий шаг