web-dev-qa-db-fra.com

Quelles sont vraiment les constantes INFINITY en Java?

J'ai récemment parcouru les constantes dans les classes de wrapper de type primitif comme Double.POSITIVE_INFINITY Et Double.NEGATIVE_INFINITY. Dans l'API, il définit le premier comme:

Une constante tenant l'infini positif de type double. Il est égal à la valeur renvoyée par Double.longBitsToDouble (0x7ff0000000000000L).

Les autres ont des définitions allant dans le même sens.

Ce que j'ai du mal à comprendre, c'est quoi ces constantes le sont réellement. Ils ne peuvent pas réellement être ou représenter infinis positifs/négatifs, car le système est par nature fini. Est-ce juste un réglage arbitraire de bits qui, selon les créateurs de Java, définirait le concept de l'infini? Ou est-ce qu'ils ont en fait une sorte de valeur spéciale? Si c'est est juste une chaîne arbitraire de bits interprétée comme un double, puis y a-t-il un nombre normal qui, lorsqu'il est interprété comme un double, retournera POSITIVE_INFINITY au lieu de la valeur réelle attendu?

Pardonnez-moi si la réponse à cette question est évidente étant donné la partie Double.longBitsToDouble(0x7ff0000000000000L) de l'API. À vrai dire, cette description est assez obscure pour moi et je ne prétendrai pas comprendre ce que les valeurs hexadécimales signifient ou représentent réellement.

33
asteri

La virgule flottante Java est basée sur la norme à virgule flottante binaire IEEE 754 Floating Point Standard , dont la première version a été publiée vers 1985, elle est donc beaucoup plus ancienne que Java. Étant donné l'implémentation matérielle répandue d'IEEE 754 au moment où Java était en cours de définition, les créateurs Java) n'avaient guère le choix.

Chaque nombre à virgule flottante IEEE 754 a trois composants, un bit de signe, un exposant et une mantisse. Simplifiant considérablement, la grandeur d'un nombre normal est:

 mantissa * (2 ** exponent)

où "**" représente la puissance.

Le bit de tête est le bit de signe. En double, les 11 bits suivants sont l'exposant.

Les modèles de bits avec tous les bits d'exposant activés sont réservés aux infinis et aux NaN. Tous les nombres normaux ont au moins un bit zéro dans l'exposant. Les deux infinis sont représentés en ayant tous les bits d'exposant allumés et tous les bits de mantisse zéro. Le bit de signe de tête distingue l'infini positif et négatif.

Le choix de tous les bits d'exposant un pour les cas spéciaux n'est pas arbitraire. Il est plus facile de couper l'un des extrêmes que de combler un écart au milieu d'une plage de nombres, en particulier pour les implémentations matérielles. La suppression de l'exposant tous les bits dans des cas spéciaux aurait empêché le codage de zéro avec le motif tous les bits et aurait donné les plus grandes valeurs de magnitude absolue, les infinis, le plus petit exposant, ce qui aurait également compliqué le matériel. Le tout sur l'exposant est certainement le meilleur choix pour les infinis.

Les deux infinis sont tous deux utilisés pour représenter deux choses, en fait des résultats infinis et des résultats qui sont trop grands en amplitude absolue pour représenter dans le système numérique normal, des nombres supérieurs à Double.MAX_VALUE ou inférieurs à -Double.MAX_VALUE. 1.0/0.0 est infini. Il en va de même pour 2 * Double.MAX_VALUE.

Il existe certains algorithmes qui peuvent être simplifiés, avec moins de cas spéciaux, en permettant aux résultats intermédiaires d'être infinis, dans les deux sens. Cela permet également par exemple même une ligne parallèle à l'axe des y pour avoir un gradient stockable qui peut être utilisé dans les calculs.

20

Ils représentent en effet représentent l'infini positif et négatif, qui sont des concepts clairement définis dans le norme à virgule flottante IEEE . Par exemple, la division d'un nombre à virgule flottante positif par zéro donne une infinité positive. Quant au motif de bits lui-même, c'est juste un motif qui a été choisi pour représenter l'infini.

6
Aasmund Eldhuset

Normes IEEE 754 à virgule flottante indique:

"Les valeurs + infini et -infini sont désignées par un exposant de tous les 1 et une fraction de tous les 0. Le bit de signe fait la distinction entre l'infini négatif et l'infini positif. Etre capable de désigner l'infini comme un une valeur spécifique est utile car elle permet aux opérations de continuer au-delà des situations de débordement. Les opérations avec des valeurs infinies sont bien définies en virgule flottante IEEE. "

Aussi: "Les opérations sur les nombres spéciaux sont bien définies par IEEE. Dans le cas le plus simple, toute opération avec un NaN donne un résultat NaN. Les autres opérations sont les suivantes: "

      Operation         Result
        n ÷ ±Infinity   0
±Infinity × ±Infinity   ±Infinity
±nonzero  ÷ 0           ±Infinity
Infinity  + Infinity    Infinity
       ±0 ÷ ±0          NaN
 Infinity - Infinity    NaN
±Infinity ÷ ±Infinity   NaN
±Infinity × 0           NaN
5
thedayofcondor