Existe-t-il des implémentations standard IEEE 754 pour les primitives à virgule flottante Java?


Je suis intéressé si Java utilise la norme IEEE 754 pour implémenter son arithmétique à virgule flottante. Ici j'ai vu ce genre de chose dans la documentation:

Opération définie dans IEEE 754-2008

Si je comprends bien le côté positif de IEEE 754 est d'augmenter la précision de l'arithmétique à virgule flottante, donc si j'utilise double ou float en Java, la présision des calculs serait-elle la même que dans BigDecimal? Et sinon quel est l'intérêt d'utiliser IEEE 754 norme dans Math cours?

Author: Wai Ha Lee, 2016-10-28

1 answers

Je suis intéressé si Java utilise la norme IEEE 754 pour implémenter son arithmétique à virgule flottante.

IEEE-754 définit des normes pour plusieurs types à virgule flottante. Pendant de nombreuses années, ils étaient tous binaires à virgule flottante; c'est ce que sont Java float et double: float est une valeur binaire à virgule flottante IEEE-754 32 bits (ce que la norme appelle binary32). double est un 64-bit (ce que la norme appelle binary64). Ces binaires les nombres à virgule flottante sont très efficaces pour les ordinateurs, mais parce qu'ils fonctionnent en binaire et que nous travaillons en décimal, il y a des incompatibilités d'attente; par exemple, 0.1 ne peut pas être stocké précisément dans un double, et vous obtenez des bizarreries comme 0.1 + 0.2 s'avérant être 0.30000000000000004. Voir Les mathématiques en virgule flottante sont-elles brisées? pour plus de détails. Ils ne sont pas un bon choix pour les calculs financiers, par exemple.

BigDecimal est une classe Java qui implémente décimal nombres fractionnaires avec une précision arbitraire. C'est beaucoup plus lent que d'utiliser double, mais les résultats correspondent à nos attentes décimales (par exemple, que 0.1 + 0.2 sera 0.3).

L'édition 2008 de la norme IEEE-754 ajoute de nouveaux formats, en particulier decimal32, decimal64, et decimal128. Ce sont décimal virgule flottante, et donc ils fonctionnent de la même manière que nous. 0.1 peut être stocké avec précision dans un decimal64. 0.1 + 0.2 est 0.3 dans decimal64. Cependant, pour autant que je sache, ils ne sont pas vraiment pertinents pour votre question.

Puisque BigDecimal est antérieur à IEEE-754 2008 (par une certaine marge), il définit sa propre sémantique.

Et sinon quel est l'intérêt d'utiliser la norme IEEE 754 en classe de mathématiques?

JDK9 ajoute de nouvelles opérations à Math qui font des choses définies par la spécification IEEE-754 2008 (telles que fma, qui fait un fondu multiplier-ajouter), et donc il définit ces opérations en référence au IEEE-754 2008 spec, pour plus de clarté.

Plus de lecture:

 17
Author: T.J. Crowder, 2018-08-02 08:57:19