Стандарт IEEE 754 требует, чтобы все операции сравнения с NaN возвращали значение False. Согласно ему, "в синтаксисе C предикат x != y имеет значение True, но все остальные: x < y, x <= y, x == y, x >= y и x > y имеют значение False всякий раз, когда x или y или оба аргумента имеют значение NaN". В Delphi 12 поддержка сравнения с NaN реализована в соответствии с этими требованиями стандарта IEEE 754.
Рассмотрим сравнения с NaN на небольшом тестовом примере:
NaN (от английского Not-a-Number) – одно из особых состояний числа с плавающей запятой, используемое во многих математических библиотеках. Оно может возникнуть в различных случаях, когда математическая операция завершилась с неопределенным результатом. Например, деление нуля на ноль, операции с бесконечностью (умножение нуля на бесконечность, деление бесконечности на бесконечность, сложение бесконечности с бесконечностью противоположного знака, вычисление квадратного корня отрицательного числа, логарифмирование отрицательного числа... NaN не равно ни одному другому значению (даже самому себе).
Рассмотрим сравнения с NaN на небольшом тестовом примере:
program NaN; {$APPTYPE CONSOLE} uses System.SysUtils; begin // вместо константы NaN из System.SysUtils.pas выполним деление нуля на ноль var x: Double := 0 / 0; WriteLn(' x = : ', x); WriteLn(' x = x: ', x = x); WriteLn(' x = 0: ', x = 0); WriteLn(' x <> x: ', x <> x ); WriteLn(' x <> 0: ', x <> 0); WriteLn(' x < x: ', x < x ); WriteLn(' x < 0: ', x < 0); WriteLn(' x > x: ', x > x); WriteLn(' x > 0: ', x > 0); WriteLn(' x <= x: ', x <= x); WriteLn(' x <= 0: ', x <= 0); WriteLn(' x >= x: ', x >= x); WriteLn(' x >= 0: ', x >= 0); ReadLn; end.который выполним в Delphi 11 и Delphi 12:
NaN (от английского Not-a-Number) – одно из особых состояний числа с плавающей запятой, используемое во многих математических библиотеках. Оно может возникнуть в различных случаях, когда математическая операция завершилась с неопределенным результатом. Например, деление нуля на ноль, операции с бесконечностью (умножение нуля на бесконечность, деление бесконечности на бесконечность, сложение бесконечности с бесконечностью противоположного знака, вычисление квадратного корня отрицательного числа, логарифмирование отрицательного числа... NaN не равно ни одному другому значению (даже самому себе).
NaN != NaN == ?
ОтветитьУдалитьtrue
Удалить