2012-04-04 13 views
2

Ich habe versucht, Fortran für mein Forschungsprojekt zu verwenden, mit dem GNU Fortran Compiler (Gfortran), neueste Version, , aber ich habe einige Probleme in der Art, wie es real verarbeitet Zahlen. Wenn Sie den Code beispielsweise haben:Präzisionsprobleme von reellen Zahlen in Fortran

program test 
implicit none 

real :: y = 23.234, z 

z = y * 100000 
write(*,*) y, z 

end program 

Sie werden als Ausgabe erhalten:

23.23999 2323400.0 

Das finde ich wirklich seltsam. Kann mir jemand sagen, was genau hier passiert? Wenn ich z sehe, kann ich sehen, dass y seine Präzision behält, also für Berechnungen, die kein Problem sein sollten, nehme ich an. Aber warum ist die Ausgabe von y nicht genau das Gleiche wie der Wert, den ich angegeben habe, und was kann ich tun, um es genau so zu machen?

+6

Sie verwenden einfach präzise IEEE-754 Floats - lesen Sie diese: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

Antwort

2

Durch einfaches Ersetzen von real durch double precision können Sie die Anzahl der signifikanten Dezimalstellen von ungefähr sechs auf ungefähr 15 auf den meisten Plattformen erhöhen.

+0

@HighPerformanceMark: (bearbeitete Antwort) Ist das besser? – wallyk

+0

Ja ............ –

1

Das allgemeine Problem ist nicht auf Fortran beschränkt, sondern die Darstellung der reellen Zahlen der Basis 10 in einer anderen Basis endlicher Genauigkeit. Diese Informatikfrage wird hier oft gestellt.

Für die spezifischen Fortran-Aspekte wird die Deklaration "real" Ihnen wahrscheinlich einen Gleitkommawert mit einfacher Genauigkeit geben. Wie wird eine Konstante als "23.234" ohne einen Typqualifikator ausgedrückt. Die Konstante "100000" ohne Dezimalpunkt ist eine ganze Zahl, so dass der Ausdruck "y * 100000" eine implizite Umwandlung einer ganzen Zahl in eine reale bewirkt, weil "y" eine reelle Variable ist.

Für frühere einige frühere Diskussionen dieser Probleme sehen Extended double precision, Fortran: integer*4 vs integer(4) vs integer(kind=4) und Is There a Better Double-Precision Assignment in Fortran 90?

1

Das Problem hier ist nicht mit Fortran, in der Tat ist es kein Problem überhaupt. Dies ist nur ein Merkmal der Fließkomma-Arithmetik. Wenn Sie darüber nachdenken, wie Sie 23.234 binär als ein einzelnes Float darstellen würden, würden Sie sehen, dass die Zahl nur in so vielen Dezimalen Genauigkeit gespeichert werden muss.

Die Sache zu erinnern, über float Punkt Nummer ist: Zahlen, die rund aussehen und auch in Base-10 wird wahrscheinlich nicht in Binär.

Einen kurzen Überblick über Gleitkomma-Themen finden Sie im Artikel Wikipedia. Und für eine sehr gründliche Erklärung, sehen Sie sich die kanonische paper von Goldberg (PDF).