На этом шаге мы рассмотрим особенности использования числовых операций отношения.
Числовые операции отношения применяются к числовым данным, причем один или оба операнда могут задаваться строкой, содержащей правильное десятичное число. Если в числовых операциях отношения какой-либо из операндов задан строкой, содержимое которой не представляет правильное десятичное число, то его значение принимается равным 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; # Проверка равенства
На следующем шаге мы рассмотрим строковые операции отношения.