10 votes

Différences en virgule flottante entre le JDK 8 et le JDK 13

Il semble que le JDK 8 et le JDK 13 ont des points flottants différents.
J'obtiens sur JDK 8, en utilisant Math :

cos(2.3) = -0.666276021279824

Et sur le JDK 13 :

cos(2.3) = -0.6662760212798241

Comment cela se produit-il ? La différence apparaît sur la 11e génération d'Intel et sur AMD Ryzen sous Windows 10.

Edit 20.03.2022 :
En utilisant Long.toHexString(Double.doubleToRawLongBits()), j'obtiens différents modèles de bits :
Je suis sur JDK 8 :

cos(2.3) = 0xbfe5522217302fe0

Et je suis sur le JDK 13 :

cos(2.3) = 0xbfe5522217302fe1

5voto

Marcono1234 Points 2746

Ceci semble être causé par une fonction intrinsèque de la JVM pour Math.cos qui est décrit dans le numéro correspondant JDK-8242461 . Le comportement qui y est observé n'est pas considéré comme un problème :

Les résultats retournés signalés dans ce bogue sont en effet des valeurs adjacentes à virgule flottante [ ]. c'est également le cas ici ]

[...]

Par conséquent, bien qu'il soit possible que l'une ou l'autre des valeurs renvoyées soit en dehors des limites de précision, le fait d'avoir des valeurs de retour différentes pour Math.cos n'est pas en soi la preuve d'un problème.

Pour des résultats reproductibles, utilisez plutôt StrictMath.cos.

Et en effet, désactiver les intrinsèques en utilisant -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_dcos (tel que proposé dans le numéro lié), provoque des Math.cos pour obtenir le même résultat (attendu) que StrictMath.cos .

Il semble donc que le comportement que vous observez ici est très probablement conforme à la norme Math ainsi que la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X