Récemment, jai rencontré un problème bizarre avec FORTRAN95. Jai initialisé les variables X et Y comme suit:

X=1.0 Y=0.1 

Plus tard, je les additionne et jimprime le résultat:

1.10000000149012 

Après avoir examiné les variables, il semble que 0,1 nest pas représenté en double précision avec une précision totale. Y a-t-il un moyen déviter cela?

Réponse

Une autre façon de procéder consiste à dabord spécifier explicitement la précision souhaitée dans la variable à laide de lintrinsèque SELECTED_REAL_KIND , puis à lutiliser pour définir et initialiser les variables. :

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

Un avantage intéressant à faire de cette façon est que vous pouvez stocker la définition de dp dans un module, puis USE ce module là où cest nécessaire. Maintenant, si jamais vous voulez changer la précision de votre programme, il vous suffit de modifier la définition de dp à cet endroit au lieu de rechercher et de remplacer tous les D0 s au fin de vos initialisations de variables. (Cest aussi pourquoi je « recommanderais de ne pas utiliser la syntaxe 1.0D-1 pour définir Y comme suggéré. Cela fonctionne, mais il sera plus difficile de trouver et de modifier toutes les instances à lavenir.)

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

Commentaires

  • Que ' a raison, cela devrait être lapproche standard.
  • Et à quelle fréquence les gens doivent-ils vraiment changer aveuglément la précision de leurs programmes sans passer par procédure de toute façon et tester? La principale raison dutiliser le schéma _dp est que la précision est clairement défini de manière portable.

Réponse

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

Vous auriez pu écrire:

X=1.0d0 Y=1.0d-1 

Barron « s réponse ci-dessous est une autre façon de faire une double précision littérale, avec lavantage de vous permettre de changer la précision de vos variables ultérieurement.

Commentaires

  • Je pense que lon devrait utiliser la méthode 1.0_dp décrite dans larticle ci-dessous.
  • Je seconde @ OndřejČert í k – La réponse de Barron ' est la meilleure.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *