Onlangs ben ik een bizar probleem tegengekomen met FORTRAN95. Ik heb de variabelen X en Y als volgt geïnitialiseerd:

X=1.0 Y=0.1 

Later tel ik ze bij elkaar op en print ik het resultaat:

1.10000000149012 

Na het onderzoeken van de variabelen, het lijkt erop dat 0,1 niet met volledige nauwkeurigheid met dubbele precisie wordt weergegeven. Is er een manier om dit te vermijden?

Antwoord

Een andere manier om dit te doen is door eerst expliciet de gewenste precisie in de variabele te specificeren met behulp van de SELECTED_REAL_KIND intrinsieke en dit vervolgens te gebruiken om de variabelen te definiëren en te initialiseren. :

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

Een mooi voordeel om het op deze manier te doen is dat je de definitie van dp in een module, dan USE die module waar nodig. Als u ooit de precisie wilt wijzigen van uw programma, hoeft u alleen de definitie van dp op die ene plaats te wijzigen in plaats van te zoeken en alle D0 s aan de einde van uw variabele initialisaties. (Dit is ook de reden waarom ik “zou aanraden om de syntaxis 1.0D-1 niet te gebruiken om Y te definiëren zoals voorgesteld. Het werkt, maar maakt het moeilijker om alle instanties in de toekomst te vinden en te wijzigen.)

Deze pagina op de Fortran Wiki geeft goede aanvullende informatie over SELECTED_REAL_KIND.

Reacties

  • Dat ' klopt, dit zou de standaard aanpak moeten zijn.
  • En hoe vaak moeten mensen de precisie van hun programmas blindelings wijzigen zonder toch procedure voor procedure te gaan en te testen? De belangrijkste reden om het _dp -schema te gebruiken, is dat de precisie duidelijk is gedefinieerd op een draagbare manier.

Answer

Je hebt de variabelen gedeclareerd als dubbele precisie, maar je hebt ze geïnitialiseerd met enkele precisie waarden.

Je had kunnen schrijven:

X=1.0d0 Y=1.0d-1 

Barron “s antwoord hieronder is een andere manier om een letterlijke dubbele precisie te maken, met als voordeel dat je de precisie van je variabelen op een later tijdstip kunt wijzigen.

Opmerkingen

  • Ik denk dat men de 1.0_dp-methode zou moeten gebruiken die in de post hieronder wordt beschreven.
  • Ik tweede @ OndřejČert í k ' s commentaar – Barron ' s antwoord is het beste.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *