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

  • At ' er korrekt, dette skal være standardmetoden.
  • Og hvor ofte skal folk virkelig ændre præcisionen på deres programmer blindt uden at gå procedure efter procedure alligevel og teste? Hovedårsagen til at bruge _dp -planen er, så præcisionen er tydelig defineret på en bærbar måde.

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *