Valeurs à virgule flottante spéciales

S’applique à : case marquée oui Databricks SQL case marquée oui 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