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
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.
_dp
-schema te gebruiken, is dat de precisie duidelijk is gedefinieerd op een draagbare manier.