Valores especiais de ponto flutuante
Aplica-se a: Databricks SQL Databricks Runtime
Vários valores especiais de ponto flutuante são tratados de maneira sem distinção entre 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 ordena-se abaixo de NaN e acima de qualquer outro valor.
- O infinito negativo é classificado abaixo de todos os 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