2017-04-03 4 views
1

Quand je code dans le langage Fortran, je trouve quand je mets la valeur REAL comme control-var dans do-loop, les sorties sont étranges, par exemple:Pourquoi les sorties sont-elles étranges quand on utilise des valeurs de type REAL comme variables de contrôle de do-loop dans Fortran?

do i=0.1,1.0,0.1 
write (13,"(F15.6)") i 
end do 

les puts sur sont: 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 .Mais quand je mets la valeur de départ 0,6:

do i=0.6,1.0,0.1 
write (13,"(F15.6)") i 
end do 

les sorties sont: 0.6,0.7,0.8,0.9 et 1.0 ne sont pas émis. Pourquoi cela arrive-t-il?

+2

N'utilisez pas cette fonction. Il a été supprimé pour de bonnes raisons. Loke celui-ci. –

Répondre

6

Il s'agit essentiellement d'un problème d'arrondi, voir Precision problems of real numbers in Fortran et le lien qui suit à partir de là. Comparer deux points flottants est délicat et ne fonctionne pas bien avec les boucles do.

Vous devez imprimer plus de nombres décimaux et pas seulement 6:

0.1000000015 
    0.2000000030 
    0.3000000119 
    0.4000000060 
    0.5000000000 
    0.6000000238 
    0.7000000477 
    0.8000000715 
    0.9000000954 
    1.0000001192 

Les valeurs ne sont pas précises.

Dans Fortran, le nombre d'itérations est calculé avant le démarrage de la boucle. Et quand vous calculez le nombre de voyage en boucle:

write (*,"(F15.10)") (1.0 - 0.1)/0.1 

write (*,"(F15.10)") (1.0 - 0.6)/0.1 

vous obtiendrez:

9.0000000000 
    3.9999997616 

si celui-ci ne sera itérée que quatre fois (3 + 1 = 4, donc i = 0,6, 0,7 , 0.8 et 0.9), parce que le nombre est tronqué de 3.999 ... à 3.

Les compteurs de boucles réels ont été supprimés de Fortran pour de bonnes raisons, ne les utilisez pas. L'arrondissement est l'un des problèmes. Le compilateur doit vous avertir:

Avertissement: fonction supprimée: Démarrer expression en boucle DO à (1) doit être entier

En outre, en nommant une variable real comme i devrait être un crime.