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?

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.