01 сентября 2023

Delphi 12. Поддержка сравнения с NaN в соответствии с требованиями IEEE

    Стандарт 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 на небольшом тестовом примере:
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 в Delphi 11 и Delphi 12

NaN (от английского Not-a-Number) – одно из особых состояний числа с плавающей запятой, используемое во многих математических библиотеках. Оно может возникнуть в различных случаях, когда математическая операция завершилась с неопределенным результатом. Например, деление нуля на ноль, операции с бесконечностью (умножение нуля на бесконечность, деление бесконечности на бесконечность, сложение бесконечности с бесконечностью противоположного знака, вычисление квадратного корня отрицательного числа, логарифмирование отрицательного числа... NaN не равно ни одному другому значению (даже самому себе).

2 комментария: