Стандарт 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
Удалить