Si vous avez besoin de calculs exacts, en particulier si vous travaillez avec des données financières ou des données d’entreprise exigeant une grande précision, vous devriez envisager d’utiliser Decimal à la place.Les nombres à virgule flottante peuvent produire des résultats inexacts, comme illustré ci-dessous :
Float32—float.Float64—double.
Float32—FLOAT,REAL,SINGLE.Float64—DOUBLE,DOUBLE PRECISION.
FLOAT(12), FLOAT(15, 22), DOUBLE(12), DOUBLE(4, 18)), mais ClickHouse les ignore.
Utilisation des nombres à virgule flottante
- Les calculs avec des nombres à virgule flottante peuvent entraîner une erreur d’arrondi.
- Le résultat du calcul dépend de la méthode utilisée (du type de processeur et de l’architecture du système informatique).
- Les calculs à virgule flottante peuvent produire des valeurs telles que l’infini (
Inf) et “pas un nombre” (NaN). Il faut en tenir compte lors du traitement des résultats. - Lors de l’analyse de nombres à virgule flottante à partir de texte, le résultat peut ne pas correspondre au nombre représentable par la machine le plus proche.
NaN et Inf
Inf– l’infini.
-Inf— Moins l’infini.
NaN— n’est pas un nombre.
NaN dans la section clause ORDER BY.
Valeurs NaN dans la sémantique d’ensemble
NaN de sorte que la comparaison scalaire NaN = NaN renvoie false.
ClickHouse suit cette règle pour l’opérateur =.
Cependant, NaN n’est pas une valeur unique ; c’est n’importe quel motif de bits dont l’exposant est entièrement à 1 et dont la
mantisse est non nulle. Des opérations différentes et des architectures CPU différentes peuvent produire des valeurs NaN
avec des bits de signe différents ou des bits de mantisse différents. Par exemple :
0./0.produit unNaNdont le bit de signe vaut 1 sur la plupart des plateformes x86.- Le littéral
nanproduit unNaNdont le bit de signe vaut 0. - Après la PR #98230, le code AArch64 NEON de
logrenvoie unNaNdont le bit de signe diffère de celui dulogscalaire de glibc pour des entrées négatives.
NaN sont hachés dans
des compartiments différents et traités comme des valeurs distinctes par les opérations à sémantique d’ensemble, notamment
DISTINCT, GROUP BY, uniqExact, countDistinct et les JOIN d’égalité sur une clé Float :
NaN n’est égal à aucune autre valeur, y compris à lui-même),
mais cela peut être surprenant. Si vous avez besoin que des opérations fondées sur une sémantique d’ensemble traitent toutes les valeurs NaN comme égales,
ramenez-les à une forme canonique dans la requête :
DISTINCT, GROUP BY et JOIN.
BFloat16
BFloat16 est un type de données à virgule flottante sur 16 bits, avec un exposant sur 8 bits, un signe et une mantisse sur 7 bits.
Il est utile pour les applications de machine learning et d’IA.
ClickHouse prend en charge les conversions entre Float32 et BFloat16,
qui peuvent être effectuées à l’aide des fonctions toFloat32() ou toBFloat16.
La plupart des autres opérations ne sont pas prises en charge.