Comment définir des valeurs de double précision dans Fortran

10

Récemment, j'ai rencontré un problème bizarre avec FORTRAN95. J'ai initialisé les variables X et Y comme suit:

X=1.0
Y=0.1

Plus tard, je les additionne et j'imprime le résultat:

1.10000000149012

Après examen des variables, il semble que 0,1 ne soit pas représenté en double précision avec une précision totale. y-a-t-il un moyen d'éviter ça?

Paul
la source

Réponses:

21

Une autre façon de procéder consiste à spécifier explicitement la précision souhaitée dans la variable à l'aide de l' intrinsèque SELECTED_REAL_KIND , puis à l'utiliser pour définir et initialiser les variables. Quelque chose comme:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

Un bon avantage à le faire de cette façon est que vous pouvez stocker la définition de dpdans un module, puis USEce module si nécessaire. Maintenant, si vous voulez changer la précision de votre programme, il vous suffit de changer la définition de dpcet endroit au lieu de rechercher et de remplacer tous les D0s à la fin de vos initialisations de variables. (C'est aussi pourquoi je recommanderais de ne pas utiliser la 1.0D-1syntaxe pour définir Y comme suggéré. Cela fonctionne, mais rend plus difficile la recherche et la modification de toutes les instances à l'avenir.)

Cette page du Fortran Wiki donne de bonnes informations supplémentaires sur SELECTED_REAL_KIND.

Barron
la source
C'est vrai, cela devrait être l'approche standard.
Ondřej Čertík
Et à quelle fréquence les gens doivent-ils vraiment changer la précision de leurs programmes à l'aveugle sans passer de procédure en procédure de toute façon et sans tester? La principale raison d'utiliser le _dpschéma est que la précision est clairement définie de manière portable.
ja72
12

Vous avez déclaré les variables en double précision, mais vous les avez initialisées avec des valeurs de simple précision.

Vous auriez pu écrire:

X=1.0d0
Y=1.0d-1

La réponse de Barron ci-dessous est une autre façon de créer une double précision littérale, avec l'avantage qu'elle vous permet de modifier la précision de vos variables ultérieurement.

Dan
la source
1
Je pense que l'on devrait utiliser la méthode 1.0_dp décrite dans le post ci-dessous.
Ondřej Čertík
1
J'appuie le commentaire de @ OndřejČertík - la réponse de Barron est la meilleure.
OscarB