Specjalne wartości zmiennoprzecinkowe
Dotyczy: Databricks SQL
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 nieskończoności dodatniej i ujemnej
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 jest sortowana niżej niż wartość NaN i wyżej niż jakiekolwiek inne wartości.
- Ujemna nieskończoność plasuje się niżej niż jakiekolwiek inne wartości.
Semantyka NaN
W przypadku obsługi typów float
lub double
, które nie są dokładnie zgodne ze standardową semantyką zmiennoprzecinkową, NaN ma następującą semantykę:
- 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 znajdują się na końcu przy sortowaniu rosnącym, jako 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