Операции отношения

Для сравнения скалярных величин предусмотрены бинарные операции отношения. Perl отличается от других языков программирования тем, что в нем сравнение числовых и строковых данных осуществляется с использованием разных операций отношения существует набор операций для сравнения числовых данных и аналогичный набор для сравнения строк. Каждый из этих наборов операций создает соответственно числовой скалярный или строковый скалярный контекст для своих операндов.

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

4. 2 представлен список всех числовых и строковых операций отношения.

Таблица 4. 2. Операции отношения числовые операции отношения сравнивают числовые данные, причем один или оба операнда могут быть заданы строкой, содержащей правильный числовой литерал.

Все, что было сказано о преобразовании таких строковых операндов в числовые при изучении арифметических операций, полностью применяется и в случае числовых операций отношения если не удастся при анализе строки слева направо выделить числовой литерал, то значение такого строкового операнда принимается равным 0. При этом в любом случае, если операнд представлен строкой, не содержащей правильный числовой литерал, при выполнении программы с включенным режимом отображения предупреждающих сообщений будет отображаться сообщение вида argument «10 cm» isn’t numeric in numeric ge () at ex04 02.

Pl line 3. С указанием нечислового операнда соответствующей операции. Смысл всех числовых операций отношения полностью соответствует их применению в математике и не вызывает затруднений.

Допустимые в perl числовые операции отношения 12 10 результат 1 (истина) 12. 8 89.

5 результат «» (ложь) 123 89 результат «» (ложь) 123! 89 результат 1 (истина) 89. 5 89. 5 результат 1 (истина) 23 89 результат «» (ложь) 14 87 результат 1 (правый операнд больше левого) 98 34 результат 1 (левый операнд больше правого).

Как видно, применение числовых операций отношения не представляет сложности. Однако следует с большой осторожностью сравнивать вещественные десятичные числа.

Если целые числа являются представителями точных чисел, то с вещественными десятичными дело обстоит несколько сложнее. Ведь программа выполняется на компьютере, в котором реализовано всего лишь подмножество множества всех вещественных чисел. Мощность этого подмножества диктуется внутренним представлением вещественных чисел в памяти компьютера.

Нельзя представить точно любое вещественное число, так как в представлении вещественных чисел в компьютере мантисса (значащие цифры числа) ограничена некоторым вполне определенным количеством цифр. Это количество цифр в мантиссе представления вещественных чисел зависит от аппаратной части самого компьютера.

Так, в компьютере с 32 разрядным процессором вещественные числа с удвоенной точностью содержат всего лишь 16 значащих цифр. Второй аспект в представлении вещественных чисел связан с переводом дробной части числа из десятичной системы счисления в двоичную ту, с которой работает большинство современных компьютеров.

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

Рассмотрим простой сценарий листинга 4. 1.

Листинг 4. 1.

Ошибки округления #! perl w $real1 0. 7, # переменная $rеаl1 равна 0. 7 $real2 10+0.

7 10 # переменная $rеаl2 равна 0. 7 # сравнение числовых переменных $real1 и $rеаl2 print(«$real1 равно $real2″) if ($real1 $real2) по нашим представлениям, этот сценарий должен напечатать строку 0.

7 равно 0. 7, так как обе переменные $real1 и $real2 содержат одно и то же число 0.

7. Попробуем выполнить этот сценарий.

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

Разгадка лежит в операторе вычисления значения переменной $rеаl2. При выполнении в выражении операций сложения в том порядке, в котором они заданы, результат будет равен 0. 699999999999999.

Это хотя и очень близкое к 0. 7 число, но все таки ему не равное.

Поэтому то результатом вычисления нашей операции сравнения является ложь, что и приводит к невыполнению операции печати. Если изменить порядок вычисления значения переменной $real 2 на 10 10+0.

7, то наш сценарий будет работать так, как мы и ожидали, так как в этом случае 0 будет складываться с 0. 7, что даст желаемый результат 0.

7. Конечно, приведенный пример тривиален, однако достаточно показателен, чтобы увидеть сложности, которые таит в себе компьютерная арифметика с вещественными числами.

Совет при сравнении на равенство двух вещественных чисел рекомендуется ввести погрешность и.