Valeurs à virgule flottante spéciales
S’applique à : Databricks SQL Databricks Runtime
Plusieurs valeurs à virgule flottante spéciales sont traitées de manière non sensible à la casse :
- Inf, +Inf, Infinity, +Infinity: infini positif
- -Inf, -Infinity : infini négatif
- NaN : non numérique
Sémantique d’Infini positif et négatif
L’infini positif et l’infini négatif ont la sémantique suivante :
- L’infini positif multiplié par toute valeur positive retourne l’infini positif.
- L’infini négatif multiplié par toute valeur positive retourne l’infini négatif.
- L’infini positif multiplié par toute valeur négative retourne l’infini négatif.
- L’infini négatif multiplié par toute valeur négative retourne l’infini positif.
- L’infini positif ou négatif multiplié par 0 retourne NaN.
- L’infini positif ou négatif est égal à lui-même.
- Dans les agrégations, toutes les valeurs d’infini positif sont regroupées. De même, toutes les valeurs d’infini négatif sont regroupées.
- L’infini positif et l’infini négatif sont traités comme des valeurs normales dans les clés de jointure.
- L’infini positif effectue un tri inférieur à NaN et supérieur à toute autre valeur.
- L’infini négatif effectue un tri inférieur à toute autre valeur.
Sémantique de NaN
Lorsque vous traitez des types float
ou double
qui ne correspondent pas exactement à la sémantique à virgule flottante standard, NaN a la sémantique suivante :
- NaN = NaN retourne la valeur true.
- Dans les agrégations, toutes les valeurs NaN sont regroupées.
- NaN est traité comme une valeur normale dans les clés de jointure.
- Les valeurs NaN s’affichent en dernier dans l’ordre croissant, supérieures à toute autre valeur numérique.
Exemples
> 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