2016-04-28 4 views
1

Druck konstant 0.8804418 in FortranWarum wird die gleiche Gleitkommakonstante in Fortran und in C anders gedruckt?

program hello 
     print *, 0.8804418 
    end program hello 

gibt 0.880441785 während die C-Version

#include <stdio.h> 

int main() { 
    printf("%.10g", 0.8804418); 
} 

druckt 0.8804418 auf demselben System (Linux x86-64 mit gfortran und gcc). Warum ist die Ausgabe anders? Beachten Sie, dass die Erhöhung der Genauigkeit in printf die Ausgabe nicht ändert.

Dies ist kein Duplikat von Is floating point math broken? oder ähnlichem. Diese Frage bezieht sich speziell auf Unterschiede in Fortran und C-Darstellung (oder Formatierung).

+4

Wie ist das ein Duplikat? – vitaut

+0

Es ist nicht genau dargestellt. Wenn es so wäre, hätte es die gleiche einfache und doppelte Mantisse. Sehr wenige Brüche, die in Dezimal geschrieben werden können, können auch genau in Basis 2 geschrieben werden. – DigitalRoss

+0

@DigitalRoss Guter Punkt. Korrigiert. – vitaut

Antwort

5

Standardmäßig sind Fortran Anzahl Konstanten einfachpräzise; In C haben jedoch Fließkomma-Literale doppelte Präzision.

Wenn Sie 0.8804418 einfacher Genauigkeit übersetzen und dann als double in C drucken, erhalten Sie 0.8804417849 gedruckt (demo)

float x = 0.8804418f; 
printf("%.10g\n", x); 

Fortran der Ausdruck die gleiche Zahl aufzurunden zu sein scheint.

Fortran Syntax für doppelte Genauigkeit REAL Zahlen verwendet Suffix d:

print *, 0.8804418d+0 

Dieser druckt 0.88044180000000005 (demo).

+0

Danke. Ich dachte, dass so etwas passiert, war aber verwirrt, weil die Vollversion von Fortran beispielsweise eine "DOUBLE PRECISION" -Variable hatte, aber ich vermute, dass irgendwo eine Konvertierung in Single-Precision erfolgte. – vitaut