Специальные значения с плавающей запятой
Область применения: Databricks SQL
Databricks Runtime
Несколько специальных значений с плавающей запятой обрабатываются без учета регистра:
- Inf, +Inf, Infinity, +Infinity — положительная бесконечность.
- -Inf, -Infinity — отрицательная бесконечность.
- NAN: не является числом
Семантика положительной и отрицательной бесконечности
Положительная и отрицательная бесконечность имеют следующую семантику:
- Положительная бесконечность, умноженная на любое положительное значение, возвращает положительную бесконечность.
- Отрицательная бесконечность, умноженная на любое положительное значение, возвращает отрицательную бесконечность.
- Положительная бесконечность, умноженная на любое отрицательное значение, возвращает отрицательную бесконечность.
- Отрицательная бесконечность, умноженная на любое отрицательное значение, возвращает положительную бесконечность.
- Положительная или отрицательная бесконечность, умноженная на 0, возвращает значение NaN.
- Положительная или отрицательная бесконечность равна самой себе.
- В агрегатах все значения положительной бесконечности группируются вместе. Аналогичным образом все отрицательные значения бесконечности группируются вместе.
- Положительная бесконечность и отрицательная бесконечность рассматриваются как обычные значения в ключах для соединения.
- Положительная бесконечность сортируется ниже, чем NaN, и выше всех других значений.
- Отрицательная бесконечность сортируется ниже всех других значений.
Семантика NaN
При работе с типами float
или double
, которые не полностью соответствуют стандартной семантике с плавающей запятой, NaN имеет следующую семантику:
- NaN = NaN возвращает значение true.
- В агрегатах все значения NaN группируются вместе.
- NaN рассматривается как обычное значение в ключах соединения.
- Значения NaN располагаются в конце в порядке возрастания, будучи больше любого другого числового значения.
Примеры
> 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