2017-06-01 6 views
1

Ich bin neu in Fortran und Codierung im Allgemeinen, also entschuldige ich mich, wenn meine Terminologie nicht korrekt ist.IEEE_UNDERFLOW_FLAG IEEE_DENORMAL in Fortran 77

Ich benutze eine Linux-Maschine mit dem Gfortran-Compiler.

Ich forsche diesen Sommer, der mich einschließt, ein Programm zu erhalten, das in ungefähr 1980 geschrieben wird, das wieder arbeitet. Es ist in Fortran 77 geschrieben. Ich habe den ganzen Code sowie einige Unterlagen darüber.

In seiner aktuellen Form erhalte ich einen "IEEE_UNDERFLOW_FLAG IEEE_DENORMAL" Fehler. Mein erster Gedanke ist, dass dieser Code in einer anderen Umgebung/Architektur entwickelt werden sollte.

Die Dokumentation besagt "Dieses Programm wurde entwickelt, um auf dem HARRIS Computersystem zu laufen. Es kann auch auf einem VAX-System ausgeführt werden, wenn die Variablen mit einfacher Genauigkeit sowohl im Hauptcode als auch im Unterroutinenpaket in doppelt genaue Variablen geändert werden. "

Ich habe versucht, die Variablen mit einfacher Genauigkeit in Variablen mit doppelter Genauigkeit zu ändern habe das falsch gemacht. Wenn das die richtige Sache wäre, wäre jede Einsicht toll.

Ich habe auch versucht, die Codierung mit -std = Legacy und -m32 zu kompilieren. Ich erhalte auch denselben Fehler.

Alle Ratschläge, um mich in die richtige Richtung zu bringen, würden sehr geschätzt werden.

+0

Die Produktion von subnormal ist wahrscheinlich zu erwarten. Es würde kein Problem bei der Wahl des Build-Verfahrens anzeigen. – tim18

+0

Die Anweisung zum Umschalten auf doppelte Genauigkeit kann wichtig sein, da die Eigenschaften von ieee754 single möglicherweise nicht besser als vax sind. – tim18

+0

Gfortran hat Optionen zum automatischen Ersetzen von Single durch Double. Sie sollten die Dokumente lesen, wenn Sie dies berücksichtigen. – tim18

Antwort

3

"IEEE_UNDERFLOW_FLAG IEEE_DENORMAL ist signalisieren" ist nicht so ungewöhnlich. Es ist keine Fehlermeldung.

Die Bedeutung ist, dass beim Ausführen des Codes denormal numbers generiert werden.

Es mag ein Hinweis auf numerische Probleme in Ihrem Code sein, aber es ist kein Fehler per se. Wahrscheinlich bedeutet dies, dass Ihr Programm erfolgreich beendet wurde.

Fortran in seiner neuesten Ausgabe erfordert, dass alle Gleitkommaausnahmen gemeldet werden, wenn eine STOP Anweisung ausgeführt wird. Siehe gfortran IEEE exception inexact Übrigens bedeutet das auch, dass Ihr Programm nicht als Fortran 77, sondern als Fortran 2003 oder höher kompiliert wird.

Beachten Sie, dass selbst wenn Sie den Fortran 95-Standard von -std=f95 anfordern, die Notiz immer noch angezeigt wird, aber es kann durch die -ffpe-summary=list Flag gesteuert werden.

Die verknüpfte Antwort sagt auch, dass ein Weg, um diese Warnungen zu vermeiden, ist, das Programm nicht durch eine STOP-Anweisung zu beenden, sondern indem es bis END PROGRAM läuft. Wenn Sie so etwas wie

STOP 
END 

oder

STOP 
END PROGRAM 

in Ihrem Code haben, entfernen Sie einfach das STOP, es ist nutzlos, wenn nicht sogar schädlich.

Sie können, aber Sie müssen nicht erfolgreich sein, das mit doppelter Genauigkeit loszuwerden. Wenn es numerische Probleme in den Algorithmen gibt, bleiben sie auch mit Doppelpunkten dort. Aber sie können weniger offensichtlich werden. Oder sie könnten nicht, es kommt darauf an.Sie müssen Ihren Code dafür nicht neu schreiben, verwenden Sie einfach -fdefault-real-8 oder -freal-4-real-8 oder ähnliches. Lesen Sie mehr über diese Optionen in Ihrer gfortran manual. Sie könnten sogar vierfache Genauigkeit versuchen, aber doppelt sollte normalerweise für alle vernünftigen Algorithmen ausreichen.

+0

nicht "am Ende", sondern nur bei "STOP" richtig? Also wenn der Code normalerweise mit einem STOP beendet wird; END 'Entfernen der' STOP' sollte behoben werden. (?) – agentp

+0

Ja, das ist die Schlussfolgerung der verknüpften Antwort. Ich sollte das auch hier betonen. –

+0

@VladimirF Ich bin mir nicht sicher, ob dies einen Fehler verursachen könnte. Nachdem ich mehr über das HARRIS-System gelesen habe, sieht es so aus, als ob der Code auf einem 48-Bit-Computer entwickelt wurde. Auch, wie ich das gfortran-Handbuch gelesen habe, ist es nicht möglich, mein Programm als Fortran 77 zu kompilieren, stimmt das? Danke für all deine Hilfe bis jetzt. – Robert

Verwandte Themen