Wie wird der Gleitkommaüberlauf in Iostreams behandelt?

8

Ich habe einen sehr einfachen Code:

%Vor%

Wenn ich diesen Code mit g ++ 4.1.2 kompiliere und ihn auf Redhat 5.10 (gleicher Compiler) laufe, bekomme ich die Ausgabe:

%Vor%

Wenn ich die gleiche Binärdatei auf Redhat Linux 6.5 (Compiler 4.4.7) ausführe, bekomme ich

%Vor%

Was ist das erwartete Verhalten? Unterlauf ist erfolgreich bei 4.4.7, aber nicht bei 4.1.2. Der Überlauf schlägt fehl (ändert aber immer noch den Wert) bei 4.4.7 und schlägt fehl, ohne etwas an 4.1.2 zu ändern.

Ist das Verhalten undefiniert oder einfach falsch auf dem einen oder anderen?

    
Ronald Van Iwaarden 12.09.2014, 14:32
quelle

1 Antwort

3

Laut C ++ 11 22.4.2.1.2 sollte die Konvertierung bei Überlauf fehlschlagen, aber nicht unterlaufen. Im Falle eines Überlaufs sollte es immer noch einen Wert des größten darstellbaren Wertes geben sowie failbit setzen.

So hat Ihr neuerer Compiler das richtige moderne Verhalten.

Allerdings sind beide Ihrer alten Compiler älter als C ++ 11. In früheren Standards wurde die Konvertierung angegeben, um einen Fehler zu geben, wenn scanf ; und im Fehlerfall keinen Wert angeben. Wenn Sie sich dem C-Standard zuwenden, wird scanf auf strtod zurückgesetzt, was wiederum einen Fehler beim Überlauf angibt. Aber ob es einen Fehler beim Unterlauf gibt, ist implementierungsdefiniert.

Ihr älterer Compiler entspricht also dem historischen Verhalten.

    
Mike Seymour 12.09.2014, 15:08
quelle

Tags und Links