Partilhar via


Valores especiais de ponto flutuante

Aplica-se a: Marque Sim Databricks SQL Marque Sim Databricks Runtime

Vários valores especiais de ponto flutuante são tratados de forma insensível a maiúsculas e minúsculas:

  • Inf, +Inf, Infinito, +Infinito: infinito positivo
  • -Inf, -Infinito: infinito negativo
  • NaN: não é um número

Semântica do infinito positiva e negativa

O infinito positivo e o infinito negativo têm a seguinte semântica:

  • O infinito positivo multiplicado por qualquer valor positivo retorna o infinito positivo.
  • O infinito negativo multiplicado por qualquer valor positivo retorna infinito negativo.
  • O infinito positivo multiplicado por qualquer valor negativo retorna o infinito negativo.
  • O infinito negativo multiplicado por qualquer valor negativo retorna o infinito positivo.
  • O infinito positivo ou negativo multiplicado por 0 retorna NaN.
  • O infinito positivo ou negativo é igual a si mesmo.
  • Nas agregações, todos os valores infinitos positivos são agrupados. Da mesma forma, todos os valores infinitos negativos são agrupados.
  • O infinito positivo e o infinito negativo são tratados como valores normais nas chaves de junção.
  • O infinito positivo classifica mais baixo do que NaN e mais alto do que qualquer outro valor.
  • O infinito negativo classifica mais baixo do que quaisquer outros valores.

Semântica NaN

Ao lidar com float ou double tipos que não correspondem exatamente à semântica de ponto flutuante padrão, NaN tem a seguinte semântica:

  • NaN = NaN retorna true.
  • Nas agregações, todos os valores NaN são agrupados.
  • NaN é tratado como um valor normal em chaves de junção.
  • Os valores NaN ficam em último lugar quando em ordem crescente, maiores do que qualquer outro valor numérico.

Exemplos

> 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