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

  • Att ' stämmer, detta borde vara standardmetoden.
  • Och hur ofta måste människor verkligen ändra precisionen i sina program utan att gå procedur förfarande ändå och testa? Den främsta anledningen att använda _dp -schemat är så att precisionen är tydligt definieras på ett bärbart sätt.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *