Nylig har jeg opplevd et bisarrt problem med FORTRAN95. Jeg initialiserte variablene X og Y som følger:
X=1.0 Y=0.1
Senere legger jeg dem sammen og skriver ut resultatet:
1.10000000149012
Etter å ha undersøkt variablene, det virker som om 0,1 ikke er representert i dobbel presisjon med full nøyaktighet. Er det noen måte å unngå dette?
Svar
En annen måte å gjøre dette på er å først eksplisitt spesifisere den presisjonen du ønsker i variabelen ved hjelp av SELECTED_REAL_KIND iboende og deretter bruke dette til å definere og initialisere variablene. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
En fin fordel med å gjøre det på denne måten er at du kan lagre definisjonen av dp
i en modul, så USE
den modulen der det er nødvendig. Nå hvis du noen gang vil endre presisjonen i programmet ditt, trenger du bare å endre definisjonen av dp
på det ene stedet i stedet for å søke og erstatte alle D0
på slutten på dine variable initialiseringer. (Dette er også grunnen til at jeg anbefaler ikke å bruke 1.0D-1
syntaksen for å definere Y som foreslått. Det fungerer, men gjør det vanskeligere å finne og endre alle forekomster i fremtiden.)
Denne siden på Fortran Wiki gir litt god tilleggsinformasjon på SELECTED_REAL_KIND
.
Kommentarer
Svar
Du erklærte variablene som dobbelt presisjon, men initialiserte dem med enkle presisjonsverdier.
Du kunne ha skrevet:
X=1.0d0 Y=1.0d-1
Barron «s svar nedenfor er en annen måte å lage en bokstavelig dobbel presisjon på, med den fordelen at den lar deg endre presisjonen til variablene dine på et senere tidspunkt.
Kommentarer
- Jeg tror at man skal bruke 1.0_dp-metoden som er beskrevet i innlegget nedenfor.
- I second @ OndřejČert í k ' s kommentar – Barron ' svaret er det beste.
_dp
-skjemaet er slik at presisjonen er tydelig definert på en bærbar måte.