Valores de números de punto flotante especiales
Se aplica a: Databricks SQL Databricks Runtime
Hay varios valores de números de punto flotante especiales que se tratan sin distinguir entre mayúsculas y minúsculas:
- Inf, +Inf, Infinity, +Infinity: infinito positivo
- -Inf, -Infinity: infinito negativo
- NAN: no es un número
Semántica de infinito positivo e infinito negativo
Un infinito positivo y un infinito negativo tienen la semántica siguiente:
- Un infinito positivo multiplicado por cualquier valor positivo devuelve un infinito positivo.
- Un infinito negativo multiplicado por cualquier valor positivo devuelve un infinito negativo.
- Un infinito positivo multiplicado por cualquier valor negativo devuelve un infinito negativo.
- Un infinito negativo multiplicado por cualquier valor negativo devuelve un infinito positivo.
- Un infinito positivo o negativo multiplicado por 0 devuelve NaN.
- Un infinito positivo o negativo es igual a sí mismo.
- En las agregaciones, se agrupan todos los valores infinitos positivos. Del mismo modo, se agrupan todos los valores infinitos negativos.
- Un infinito positivo y un infinito negativo se tratan como valores normales en las claves de combinación.
- Un infinito positivo se ordena por debajo de NaN y por encima de cualquier otro valor.
- Un infinito negativo se ordena por debajo de cualquier otro valor.
Semántica de NaN
Cuando se trabaja con tipos float
o double
que no coinciden exactamente con la semántica de los números de punto flotante estándar, NaN tiene la semántica siguiente:
- NaN = NaN devuelve True.
- En las agregaciones, se agrupan todos los valores NaN.
- NaN se trata como un valor normal en las claves de combinación.
- Los valores NaN son los últimos cuando están en orden ascendente, es decir, son mayores que cualquier otro valor numérico.
Ejemplos
> 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