Fortran: Was genau ist .d0?
Ich verstehe, dass .d0
bezeichnet double precision
aber ich Frage mich, wie es zusammen geht mit Benutzer definierten Genauigkeit. Ich benutze
module precision
implicit none
integer, parameter :: DP = selected_real_kind(r=250,p=13)
end module precision
und erklären Schwimmer wie
real(KIND=DP) :: var1
Wann immer ich brauche, um einen Wert zuzuweisen, wie ein schweben irgendwo in dem Programm, das ich tun
var1 = 1_DP
Nun das problem, das ich habe, ist, dass es nicht funktioniert, wenn ich Lesen Sie den Wert aus einer namelist. Der compiler besteht auf
&namelistName
var1 = 1.d0
!var1 = 1_DP ! this does not work
&end
Zwei Fragen Folgen:
- Was passiert, wenn ich einen Wert zuweisen von
1.d0
eine variable deklariert alsreal(KIND=DP)
? - Gibt es eine Möglichkeit, wie man erzwingen
1_DP
im namelists? Wenn es darauf ankommt, natürlich.
- Sie schreiben nicht, warum es nicht funktioniert. In der Tat ist dieser Satz alnost immer bedeutet, dass Sie sollten beinhalten etwas mehr, Fehlermeldung oder sonstwas.
1_dp
ist eine ganze Zahl. - Warten Sie eine minute,
1_DP
ist eine ganze Zahl?! Ups, wirklich? OK vergiss die Frage 2 jetzt. Was ist mit Frage 1? Wenn ich1.d0
was mache ich eigentlich? Ich werde überprüfen Sie die compiler-Meldung mittlerweile. - Dieser immer noch aktive thread kann auch helfen, Sie verstehen die details groups.google.com/forum/#!topic/comp.lang.fortran/...
- Vielen Dank ich habe angefangen es zu Lesen und es sieht sehr informativ.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das gesamte Konzept der Arten macht nur Sinn, in den Quellcode, dort ist keine Weise, damit es funktioniert für die Eingabe der Daten, da zur Laufzeit das system weiß nichts über Sie.
In den Quellcode
ist, eine doppelter Genauigkeit real,
ist eine echte mit freundlichen
dp
,ist eine ganze Zahl (ohne Dezimalstellen vorhanden) mit freundlichen
dp
.In der input-Daten, die Sie nicht brauchen, um geben Sie die Genauigkeit an alle, brauchen Sie nur eine Nummer. Das runtime-system wandelt dann den string mit einer Zahl, um die richtige Art von variable, die Sie versuchen zu Lesen.
Können Sie
1.e0
,1.d0
Erweiterung vielleicht sogar1.q0
, nur um flexibel zu sein, aber es ändert nichts an der Bedeutung. In der input-Datei, es ist nur ein string, der eine Zahl ist.Was passiert, wenn Sie in den source-code zuordnen
real(dp) :: x = 1.d0
?Es ist einfach nur zugewiesen, wenn die
dp
Art ist die gleiche Art wie die double-precision. Sonst wird es umgewandelt. Wenn die reelle Konstante Wert ist eine kleine ganze Zahl, die Umwandlung ist einfach und keine Genauigkeit verloren, da Sie exakt dargestellt.1_DP
und1._DP
. Ich habe immer getan, in den source-code, aber dann muss der compiler konvertiert den integer in einen float, so dass ich nie den Unterschied bemerkt. Obwohl ich irgendwo gelesen habe, dass1_DP
würde umgewandelt werden in einsingle precision
nur (finde es jetzt nicht). Daher habe ich versehentlich fiel in diese Falle.real(dp) :: x = 1._d0
?", wenn ichx = 1_DP
,x = 1._DP
oderx = 1.d0
es kompiliert. Dabeix = 1._d0
eigentlich nicht. Interessanterweise tunx = 1._DP
in die namelist-Datei funktioniert auch nicht, aber ich habe nicht gesehen, dass die Fehlermeldung trotzdem kann ich nur sagen, es gibt nicht-null-status und segfaults daher. Allerdings aus Sie Antwort entnehme ich, dassx = 1.d0
im namelist ist in Ordnung und werde nicht verlieren mich die Präzision.1._d0
war ein Fehler, es sollte1.0d0
oder1.d0
. Auch ich mage
dann besserd
im Daten-Dateien, aber das ist eine Stil-Sache.