Die Unendlichkeit in Fortran
Was ist der sicherste Weg, um eine variable zu +Infinity in Fortran? Im moment bin ich mit:
program test
implicit none
print *,infinity()
contains
real function infinity()
implicit none
real :: x
x = huge(1.)
infinity = x + x
end function infinity
end program test
aber ich Frage mich, ob es einen besseren Weg gibt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr compiler unterstützt ISO TR 15580 IEEE-Arithmetik, die einen Teil des sogenannten Fortran 2003 standard als Sie verwenden können, Verfahren von ieee_* Module.
Ich würde mich nicht darauf verlassen, dass der compiler die Unterstützung der IEEE-standard, und tun ziemlich viel, was Sie Tat, mit zwei änderungen:
Ich würde nicht hinzufügen
huge(1.)+huge(1.)
, da einige Compiler können Sie am Ende mit-huge(1.)+1
--- und dies kann zu einem Speicherleck (ich weiß nicht, warum, aber es ist eine experimentelle Tatsache, so zu sagen).Sind Sie mit
real
Typen hier. Ich persönlich bevorzuge alle meine floating-point-zahlen alsreal*8
, damit alle float-Konstanten, die qualifiziert sind, mitd0
wie diese:huge(1.d0)
. Dies ist nicht die Regel, natürlich; einige Menschen lieber mit beidenreal
-s undreal*8
-s.real*8
unddouble precision
(1.d0
) sind nicht necesarilly der gleichen realen Art. Und natürlich, ob single oder double precision ist nicht eine Frage der persönlichen Vorliebe sein, aber der mathematische Argumente und tests.Ich weiß nicht, über die am sichersten, aber ich kann Ihnen eine alternative Methode. Ich habe gelernt, es zu tun auf diese Weise:
Wenn Sie mit außergewöhnlichen Werten in Ausdrücken (ich glaube nicht, dass dies generell ratsam ist) sollte man achten, wie sich Ihr compiler verarbeitet Sie, Sie könnten einige unerwartete Ergebnisse anders.
Ich bin mir nicht sicher, ob die Lösung Balg funktioniert auf allen Compilern, aber es ist eine schöne mathematische Weise zu erreichen, infinity-als -log(0).
Funktioniert auch schön für komplexe Variablen.
Dies scheint für mich arbeiten.
Definieren Sie einen parameter
Dann verwenden, wenn in tests.
Beim kompilieren mit ifort & run, bekomme ich