Se você precisa de cálculos precisos, especialmente se trabalha com dados financeiros ou de negócios que exigem alta precisão, considere usar Decimal.Números de ponto flutuante podem levar a resultados imprecisos, como ilustrado abaixo:
Float32—float.Float64—double.
Float32—FLOAT,REAL,SINGLE.Float64—DOUBLE,DOUBLE PRECISION.
FLOAT(12), FLOAT(15, 22), DOUBLE(12), DOUBLE(4, 18)), mas o ClickHouse os ignora.
Uso de números de ponto flutuante
- Cálculos com números de ponto flutuante podem produzir erro de arredondamento.
- O resultado do cálculo depende do método de cálculo (do tipo de processador e da arquitetura do sistema computacional).
- Cálculos de ponto flutuante podem resultar em números como infinito (
Inf) e “não é um número” (NaN). Isso deve ser levado em conta ao processar os resultados dos cálculos. - Ao interpretar números de ponto flutuante a partir de texto, o resultado pode não ser o número representável pela máquina mais próximo.
NaN e Inf
Inf– infinito.
-Inf— Infinito negativo.
NaN— Não é um número.
NaN na seção cláusula ORDER BY.
Valores NaN na semântica de conjunto
NaN de modo que a comparação escalar NaN = NaN retorne false.
O ClickHouse segue essa regra para o operador =.
No entanto, NaN não é um único valor; ele pode ser qualquer padrão de bits em que o expoente é composto apenas por uns e a
mantissa é diferente de zero. Operações diferentes e arquiteturas de CPU diferentes podem produzir valores NaN
com bits de sinal diferentes ou payloads de mantissa diferentes. Por exemplo:
0./0.produz umNaNcujo bit de sinal é 1 na maioria das plataformas x86.- O literal
nanproduz umNaNcujo bit de sinal é 0. - Após o PR #98230, o caminho NEON em AArch64 de
logretorna umNaNcujo bit de sinal difere dologescalar da glibc para entradas negativas.
NaN diferentes caem em
buckets diferentes e são tratados como valores distintos por operações com semântica de conjunto, incluindo
DISTINCT, GROUP BY, uniqExact, countDistinct e equi-JOIN em uma chave Float:
NaN é diferente de qualquer outro valor, inclusive de si mesmo)
mas pode causar estranheza. Se você precisar que operações com semântica de conjunto tratem todos os valores NaN como iguais,
normalize-os na consulta:
DISTINCT, GROUP BY e JOIN.
BFloat16
BFloat16 é um tipo de dado de ponto flutuante de 16 bits, com expoente de 8 bits, sinal e mantissa de 7 bits.
Ele é útil para aplicações de aprendizado de máquina e IA.
O ClickHouse oferece suporte a conversões entre Float32 e BFloat16, que
podem ser realizadas com as funções toFloat32() ou toBFloat16.
A maioria das outras operações não tem suporte.