So legen Sie in Fortran Werte mit doppelter Genauigkeit fest

10

Vor kurzem bin ich auf ein bizarres Problem mit FORTRAN95 gestoßen. 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 der Untersuchung der Variablen scheint es, als ob 0,1 nicht mit voller Genauigkeit mit voller Genauigkeit dargestellt wird. Gibt es eine Möglichkeit, dies zu vermeiden?

Paul
quelle

Antworten:

21

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 diese dann zum Definieren und Initialisieren der Variablen zu verwenden. So etwas wie:

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 dpin einem Modul speichern können , dann USEdas Modul, wo es benötigt wird. Wenn Sie jetzt jemals die Genauigkeit Ihres Programms ändern möchten, müssen Sie nur die Definition von dpan dieser einen Stelle ändern , anstatt alle D0s am Ende Ihrer Variableninitialisierungen zu suchen und zu ersetzen . (Aus diesem Grund würde ich auch empfehlen, die 1.0D-1Syntax nicht zu verwenden , um Y wie vorgeschlagen zu definieren. Es funktioniert, erschwert jedoch das Auffinden und Ändern aller Instanzen in der Zukunft.)

Diese Seite im Fortran-Wiki enthält einige gute zusätzliche Informationen zu SELECTED_REAL_KIND.

Barron
quelle
Das ist richtig, dies sollte der Standardansatz sein.
Ondřej Čertík
Und wie oft müssen Menschen die Präzision ihrer Programme wirklich blind ändern, ohne ohnehin Prozedur für Prozedur zu gehen und zu testen? Der Hauptgrund für die Verwendung des _dpSchemas besteht darin, dass die Genauigkeit auf tragbare Weise klar definiert wird.
Ja72
12

Sie haben die Variablen als doppelte Genauigkeit deklariert, sie jedoch mit Werten mit einfacher Genauigkeit initialisiert.

Du hättest schreiben können:

X=1.0d0
Y=1.0d-1

Die folgende Antwort von Barron ist 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.

Dan
quelle
1
Ich denke, dass man die 1.0_dp-Methode verwenden sollte, die im folgenden Beitrag beschrieben wird.
Ondřej Čertík
1
Ich stimme dem Kommentar von @ OndřejČertík zu - Barrons Antwort ist die beste.
OscarB