Specjalne wartości zmiennoprzecinkowe

Dotyczy: zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Kilka specjalnych wartości zmiennoprzecinkowych jest traktowanych w sposób niewrażliwy na wielkość liter:

  • Inf, +Inf, Infinity, +Infinity: nieskończoność dodatnia
  • -Inf, -Infinity: nieskończoność ujemna
  • NaN: nie liczba

Semantyka dodatnia i ujemna nieskończoności

Nieskończoność dodatnia i ujemna mają następujące semantyki:

  • Nieskończoność dodatnia pomnożona przez dowolną wartość dodatnią zwraca nieskończoność dodatnią.
  • Nieskończoność ujemna pomnożona przez dowolną wartość dodatnią zwraca nieskończoność ujemną.
  • Nieskończoność dodatnia pomnożona przez dowolną wartość ujemną zwraca nieskończoność ujemną.
  • Nieskończoność ujemna pomnożona przez dowolną wartość ujemną zwraca nieskończoność dodatnią.
  • Nieskończoność dodatnia lub ujemna pomnożona przez wartość 0 zwraca wartość NaN.
  • Nieskończoność dodatnia lub ujemna jest równa samej sobie.
  • W agregacjach wszystkie dodatnie wartości nieskończoności są grupowane razem. Podobnie wszystkie wartości nieskończoności ujemnej są grupowane razem.
  • Nieskończoność dodatnia i nieskończoność ujemna są traktowane jako normalne wartości w kluczach sprzężenia.
  • Nieskończoność dodatnia sortuje mniej niż Wartość NaN i wyższa niż jakiekolwiek inne wartości.
  • Nieskończoność ujemna sortuje mniej niż jakiekolwiek inne wartości.

Semantyka sieci nan

W przypadku obsługi typów lubdouble, które nie są dokładnie zgodne ze float standardową semantyka zmiennoprzecinkową, naN ma następujące semantyki:

  • NaN = NaN zwraca wartość true.
  • W agregacjach wszystkie wartości NaN są grupowane razem.
  • NaN jest traktowana jako wartość normalna w kluczach sprzężenia.
  • Wartości naN idą ostatnio, gdy w kolejności rosnącej, większe niż jakakolwiek inna wartość liczbowa.

Przykłady

> SELECT double('infinity');
 Infinity

> SELECT float('-inf');
 -Infinity

> SELECT float('NaN');
 NaN

> SELECT double('infinity') * 0;
 NaN

> SELECT double('-infinity') * (-1234567);
 Infinity

> SELECT double('infinity') < double('NaN');
 true

> SELECT double('NaN') = double('NaN');
 true

> SELECT double('inf') = double('infinity');
 true

> SELECT COUNT(*), c2
    FROM VALUES (1, double('infinity')),
                (2, double('infinity')),
                (3, double('inf')),
                (4, double('-inf')),
                (5, double('NaN')),
                (6, double('NaN')),
                (7, double('-infinity'))
        AS test(c1, c2)
    GROUP BY c2;
        2       NaN
        2 -Infinity
        3  Infinity