Nyligen har jag stött på ett bisarrt problem med FORTRAN95. Jag initierade variablerna X och Y enligt följande:
X=1.0 Y=0.1
Senare lägger jag till dem och skriver ut resultatet:
1.10000000149012
Efter att ha granskat variablerna, det verkar som om 0,1 inte representeras i dubbel precision med full noggrannhet. Finns det något sätt att undvika detta?
Svar
Ett annat sätt att göra detta är att först uttryckligen specificera den precision du önskar i variabeln med hjälp av SELECTED_REAL_KIND inneboende och sedan använda detta för att definiera och initialisera variablerna. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
En trevlig fördel med att göra det på detta sätt är att du kan lagra definitionen av dp
i en modul, sedan USE
den modulen där det behövs. Om du någonsin vill ändra precision i ditt program behöver du bara ändra definitionen av dp
på den ena platsen istället för att söka och ersätta alla D0
på slutet på dina variabla initialiseringar. (Det är också därför jag rekommenderar att du inte använder 1.0D-1
syntax för att definiera Y som föreslagit. Det fungerar, men gör det svårare att hitta och ändra alla instanser i framtiden.)
Denna sida på Fortran Wiki ger bra ytterligare information om SELECTED_REAL_KIND
.
Kommentarer
Svar
Du förklarade variablerna som dubbel precision, men du initierade dem med enstaka precisionsvärden.
Du kunde ha skrivit:
X=1.0d0 Y=1.0d-1
Barron ”s svara nedan är ett annat sätt att göra en bokstavlig dubbel precision med fördelen att det gör att du kan ändra precisionen på dina variabler vid en senare tidpunkt.
Kommentarer
- Jag tycker att man ska använda metoden 1.0_dp som beskrivs i inlägget nedan.
- Jag andra @ OndřejČert í k ' s kommentar – Barron ' svaret är det bästa.
_dp
-schemat är så att precisionen är tydligt definieras på ett bärbart sätt.