Valores especiais de ponto flutuante
Aplica-se a: SQL do Databricks Runtime do Databricks
Vários valores especiais de ponto flutuante não diferenciam maiúsculas de minúsculas:
- Inf, + inf, infinito, + infinito: infinito positivo
- -Inf,-Infinity: infinito negativo
- NaN: não é um número
Semântica do infinito positivo e negativo
Infinito positivo e negativo têm a seguinte semântica:
- Infinito positivo multiplicado por qualquer valor positivo retorna infinito positivo.
- Infinito negativo multiplicado por qualquer valor positivo retorna infinito negativo.
- Infinito positivo multiplicado por qualquer valor negativo retorna infinito negativo.
- Infinito negativo multiplicado por qualquer valor negativo retorna infinito positivo.
- Infinito positivo ou negativo multiplicado por 0 retorna NaN.
- Infinito positivo ou negativo é igual a ele mesmo.
- Em agregações, todos os valores de infinito positivos são agrupados. Da mesma forma, todos os valores de infinito negativos são agrupados.
- Infinito positivo e infinito negativo são tratados como valores normais em chaves de junção.
- O infinito positivo classifica menor que NaN e maior do que quaisquer outros valores.
- O infinito negativo classifica menor que qualquer outro valor.
Semântica de NaN
Ao lidar com tipos float
ou double
que não correspondem com exatidão à semântica do ponto flutuante padrão, NaN tem a seguinte semântica:
- NaN = NaN retorna true.
- Em agregações, todos os valores NaN são agrupados.
- NaN é tratado como um valor normal em chaves de junção.
- Os valores NaN ficam por último em ordem crescente, 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