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

  • At ' stemmer, dette bør være standard tilnærming.
  • Og hvor ofte må folk virkelig endre presisjonen på programmene sine uten å gå prosedyren etter fremgangsmåte uansett og teste? Hovedårsaken til å bruke _dp -skjemaet er slik at presisjonen er tydelig definert på en bærbar måte.

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *