Vor kurzem ist bei FORTRAN95 ein bizarres Problem aufgetreten. Ich habe die Variablen X und Y wie folgt initialisiert:
X=1.0 Y=0.1
Später addiere ich sie und drucke das Ergebnis aus:
1.10000000149012
Nach Prüfung der Variablen Es scheint, als ob 0.1 nicht mit voller Genauigkeit in doppelter Genauigkeit dargestellt wird. Gibt es eine Möglichkeit, dies zu vermeiden?
Antwort
Eine andere Möglichkeit, dies zu tun, besteht darin, zuerst die gewünschte Genauigkeit in der Variablen explizit mit dem intrinsischen SELECTED_REAL_KIND anzugeben und dann die Variablen zu definieren und zu initialisieren :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Ein schöner Vorteil auf diese Weise ist, dass Sie die Definition von dp
in a speichern können Modul, dann USE
das Modul, wo es benötigt wird. Nun, wenn Sie jemals die Genauigkeit ändern möchten In Ihrem Programm müssen Sie nur die Definition von dp
an dieser einen Stelle ändern, anstatt alle D0
s am zu suchen und zu ersetzen Ende Ihrer Variableninitialisierungen. (Aus diesem Grund würde ich empfehlen, die Syntax 1.0D-1
nicht zu verwenden, um Y wie vorgeschlagen zu definieren. Es funktioniert, macht es jedoch schwieriger, alle Instanzen in Zukunft zu finden und zu ändern.)
Diese Seite im Fortran-Wiki enthält einige gute zusätzliche Informationen zu SELECTED_REAL_KIND
.
Kommentare
- Damit ' richtig ist, sollte dies der Standardansatz sein.
- Und wie oft müssen Menschen die Genauigkeit ihrer Programme wirklich blind ändern, ohne ohnehin Prozedur für Prozedur zu gehen und zu testen? Der Hauptgrund für die Verwendung des Schemas
_dp
ist, dass die Genauigkeit eindeutig ist auf tragbare Weise definiert.
Antwort
Sie haben die Variablen als doppelte Genauigkeit deklariert, sie jedoch mit initialisiert Werte mit einfacher Genauigkeit.
Sie hätten schreiben können:
X=1.0d0 Y=1.0d-1
Barron „s antworte Im Folgenden finden Sie eine weitere Möglichkeit, eine wörtliche doppelte Genauigkeit zu erzielen, mit dem Vorteil, dass Sie die Genauigkeit Ihrer Variablen zu einem späteren Zeitpunkt ändern können.
Kommentare
- Ich denke, man sollte die im folgenden Beitrag beschriebene 1.0_dp-Methode verwenden.
- I second @ OndřejČert í k – Die Antwort von Barron ' ist die beste.