Bonjour,
dans l'exemple qui suit, d'où viennent les perturbations dans le calcul ?
Real A,Y
Y = 1000.2
A = Y - 1000.0
PRINT *, A ! Prints 0.200012
Merci
Bonjour,
dans l'exemple qui suit, d'où viennent les perturbations dans le calcul ?
Real A,Y
Y = 1000.2
A = Y - 1000.0
PRINT *, A ! Prints 0.200012
Merci
Elles viennent de l'arrondi machine à ce qu'il me semble.
Si tu souhaites un résultat plus précis, il faut déclarer ton réel en double précision :
Mais tu auras encore (je pense) le même soucis à ceci près qu'il devrait toucher la 15e décimale.REAL(KIND=8) :: A,Y
Salut!
Il ne s'agit pas d'un problème de programmation ou de langage: c'est le processeur de ton ordinateur qui applique la norme IEEE 754, parce que les nombres réels sont stockés et traités avec un nombre fini de bits.
Jean-Marc Blanc
PS: Selon moi, ça devrait être le sujet de la première leçon d'un cours pour débutants en informatique.
En utilisant des doubles ou des quads, tu corriges en partie seulement le problème : tu continues à assigner des simples real 1000.2 et 1000.0 à un double ou un quad. Ces derniers vont simplement conserver plus de décimales imprécises, ils ne vont pas inventer / corriger la précision.
Pour vraiment corriger, tu dois assigner des constantes doubles ou quads.
Comment ?
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Real (8) A,Y Y = 1000.2d0 A = Y - 1000.0d0 PRINT *, A ! Prints 0.200012
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 integer, parameter :: rk = selected_real_kind(15) real (rk) A,Y Y = 1000.2_rk A = Y - 1000.0_rk PRINT *, A ! Prints 0.200012
Bonjour,
Merci pour vos réponses. La commande utilisée est pour les versions de Fortran 95 et ultérieures, je dois utiliser le Fortran 77 pour une raison particulière. Il est vrai comme je l'ai lu plus haut que ces perturbations viennent de la conversion en binaire des valeurs en virgule flottante, de plus, c'est le fait que les deux valeurs soient très proches l'une de l'autre qui fait ça.
Partager