Un sujet souvent évoqué et qui mérite l'attention.
En informatique, les nombres à virgule flottante, float sur 32 bits, double sur 64 bits et long_double sur 80 bits ont un nombre fini de valeurs possibles.
La précision est de 7 chiffres pour des float, 15 chiffres pour des double et 19 chiffes pour les long_double.
Il en résulte que des réels, mathématiquement égaux, mais résultant d'opérations arithmétiques successives ne seront généralement pas égaux.
Pour le montrer, j'ai fait la simulation suivante répétée 100 fois.
Soit 2 segments AB et CD. Leur intersection est I. Les coordonnées ont été choisies de façon à avoir une intersection franche et ainsi éviter des problèmes relatifs à la précision.
Le programme calcule la projection du point I sur les 2 segments il en résulte les coordonnées d'un point H sur chaque segment. Mathématiquement les coordonnées de H sont identique à celles de I. L'impression le confirme, pourtant la différence de ces 2 valeurs n'est pas nulle.
Pour les 6 premiers essais, le programme imprime les dx du point H et du point I pour chaque segment, puis les dy. Ligne suivante, la différence multipliée par E^10.
On constate que aucune valeur n'est exacte.
On remarquera par ailleurs que, bien que tous les calculs soient faite en "double" le 7è chiffre est parfois différent.
- Code: Tout sélectionner
12.430280 12.430280 et 3.486074 3.486074
dX=-2288.020138e-10 dY=8158.384994e-10
16.834583 16.834583 et -16.401022 -16.401022
dX=-894.962184e-10 dY=-918.620522e-10
7.125328 7.125328 et 4.636772 4.636772
dX=941.345810e-10 dY=-1446.566102e-10
13.268119 13.268119 et -22.455408 -22.455408
dX=-1890.511925e-10 dY=-1117.037698e-10
14.613280 14.613281 et 7.035599 7.035598
dX=-2254.128191e-10 dY=4681.934094e-10
17.814513 17.814513 et -14.488207 -14.488207
dX=3749.991961e-10 dY=4610.941744e-10
14.121838 14.121837 et 10.282125 10.282125
dX=3183.644637e-10 dY=-4372.531137e-10
16.859708 16.859708 et -14.892975 -14.892975
dX=2893.464313e-10 dY=3275.568616e-10
17.902688 17.902688 et 17.069322 17.069322
dX=1197.247492e-10 dY=-1255.700077e-10
20.904727 20.904727 et -10.476822 -10.476821
dX=-3208.671515e-10 dY=-6402.362054e-10
19.586919 19.586919 et 4.667658 4.667657
dX=-1443.283004e-10 dY=6056.457371e-10
12.571592 12.571592 et -19.203598 -19.203598
dX=4864.059662e-10 dY=3184.245578e-10
Nombre de bons = 0 nombre de faux = 200
