For nylig har jeg stødt på et bizart problem med FORTRAN95. Jeg initialiserede variabler X og Y som følger:
X=1.0 Y=0.1
Senere tilføjer jeg dem sammen og udskriver resultatet:
1.10000000149012
Efter at have undersøgt variablerne, det ser ud som om 0,1 ikke er repræsenteret i dobbelt præcision med fuld nøjagtighed. Er der nogen måde at undgå dette på?
Svar
En anden måde at gøre dette på er først eksplicit at specificere den nøjagtighed, du ønsker i variablen ved hjælp af SELECTED_REAL_KIND iboende og derefter bruge dette til at definere og initialisere variablerne. Noget som :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
En god fordel ved at gøre det på denne måde er, at du kan gemme definitionen af dp
i en modul, så USE
det modul, hvor det er nødvendigt. Hvis du nogensinde vil ændre præcisionen i dit program, skal du kun ændre definitionen af dp
det ene sted i stedet for at søge og erstatte alle D0
s på slutningen af dine variable initialiseringer. (Dette er også grunden til, at jeg ikke vil bruge 1.0D-1
syntaksen til at definere Y som foreslået. Det virker, men gør det sværere at finde og ændre alle forekomster i fremtiden.)
Denne side på Fortran Wiki giver nogle gode yderligere oplysninger om SELECTED_REAL_KIND
.
Kommentarer
Svar
Du erklærede variablerne som dobbelt præcision, men initialiserede dem med enkelte præcisionsværdier.
Du kunne have skrevet:
X=1.0d0 Y=1.0d-1
Barron “s svar nedenfor er en anden måde at fremstille en bogstavelig dobbelt præcision med den fordel, at den giver dig mulighed for at ændre præcisionen af dine variabler på et senere tidspunkt.
Kommentarer
- Jeg synes, at man skulle bruge metoden 1.0_dp, der er beskrevet i posten nedenfor.
- I anden @ OndřejČert í k ' s kommentar – Barron ' s svar er det bedste.
_dp
-planen er, så præcisionen er tydelig defineret på en bærbar måde.