Valores de números de punto flotante especiales

Se aplica a:casilla marcada como Sí Databricks SQL casilla marcada como Sí 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