2017-01-19 5 views
0

Kann jemand bitte erklären, wie Fortran Daten liest, insbesondere aus Textdateien. Ich dachte, ich verstehe das Verhalten und die Formatierungsoptionen von I/O, aber das folgende Beispiel hat mich verwirrt.Fortran Float aus Textdatei lesen - Ungerades Verhalten

ich in drei Werte aus der Textdatei Domain.txt zu lesen versucht bin, die unter

221 
500.0200 
500.0000 

Diese Datei drei Linien dargestellt enthält, wird dann unter

program main 
implicit none 
integer :: N 
real :: xmax,xmin 

open(unit=1,file='Domain.txt') 

read(1,*) N  ! Read first line 
read(1,*) xmax ! Read second line 
read(1,*) xmin ! Read third line 

print*, N 
print*, xmax 
print*, xmin 
end program 

Das Ergebnis dieser durch mein Programm lesen Programm ist

 221 
500.019989 
500.000000 

Also meine Verwirrung entsteht mit dem s zweiter Ausgang für die Variable xmax. Warum würde es in der zweiten Zeile als 500.019989 und nicht 500.0200 lesen?

Ich habe versucht, Fortran Formatierung format(fm.d) in der Anweisung lesen zu lesen nur in den ersten beiden Ziffern nach der Dezimalstelle lesen, aber ich war nie in der Lage, das Problem zu lösen.

Ich benutze gfortran 4.8.5. Jede Hilfe wäre willkommen. Ich weiß auch, dass dies ein Duplikat der hier gestellten Frage ist (Reading REAL's from file in FORTRAN 77 - odd results), aber ich habe nicht genug Ansehen, um eine Frage zu der Lösung zu kommentieren und zu stellen.

+0

Möglicherweise auch verwandt ist [diese Frage] (http://stackoverflow.com/q/33319357), die auf die Genauigkeit beim Lesen von Datei schaut. – francescalus

Antwort

1

Die Zahl 2/100 (die der Bruchteil von 500.02 ist) hat keine endliche Darstellung in Binärform. Es hat die unendliche periodische Darstellung 0,0000001010001111010111000010100011110101110000101 ... So wird der Wert paßt in das Repräsentationsmodell von Gleitkommazahlen und als solche beim Lesen erscheint abgeschnitten oder abgerundet sein. Dies ist, wie alle Sprachen (einschließlich Fortran, C, C++, Java ...) mit einer binären Darstellung von Fließkommazahlen reagieren.

+0

Also ich denke, was Sie sagen, ist, dass Fortran den String-Wert korrekt aus der Textdatei einlesen kann, aber beim Konvertieren dieser Zeichenfolge in eine reale hat es diese Konvertierung zum Gleitkommafehler geführt. Ich war nur sehr verwirrt, weil ich die Ausgabetextdatei aus einem Python-Skript geschrieben habe und bei der Eingabe des Fortran-Codes andere Ergebnisse gefunden habe. – arie64

+1

Beachten Sie, dass das Problem auf eine offensichtliche Weise auftritt, da Fortran's Standard-Real nur eine einfache Genauigkeit ist. Wenn Sie 'double precision' deklarieren, sollten Sie' 500.0200000' gedruckt sehen (obwohl das zugrundeliegende Problem der binären Darstellung, die nicht genau mit der Dezimalzahl übereinstimmt, immer noch dort ist, wie es auch in Python ist) – agentp

Verwandte Themen