Ponto flutuante especial values
Aplica-se a: Databricks SQL Databricks Runtime
Vários values de ponto flutuante especiais são tratados de forma que não diferencia 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 infinitos positivos values são agrupados juntos. Da mesma forma, todos os infinitos negativos values são agrupados juntos.
- O infinito positivo e o infinito negativo são tratados como normais values em chaves join.
- O infinito positivo é classificado abaixo de NaN e mais alto do que qualquer outro values.
- O infinito negativo é classificado abaixo de qualquer outro values.
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.
- Em agregações, todos os valores NaN values são agrupados.
- NaN é tratado como valor normal nas chaves join.
- NaN values aparecer por último quando em ordem crescente, pois é maior 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