Wie man einen Schwimmer überläuft?

8

Ich arbeite an meinem Weg zur Lösung von Übung 2.1 von "Die C-Programmiersprache", wo man auf der lokalen Maschine den Bereich verschiedener Typen wie char, short, int usw. berechnen sollte, aber auch float und double. Bei allem außer float und double schaue ich auf den Überlauf und kann so die max / min Werte berechnen. Bei Floats funktioniert das immer noch nicht.

Die Frage ist also, warum dieser Code zweimal den gleichen Wert ausgibt? Ich dachte, die zweite Zeile sollte inf

ausgeben %Vor%     
Vladimir 22.08.2017, 09:30
quelle

2 Antworten

5

Versuchen Sie, mit 10 zu multiplizieren, und wenn überläuft. Der Grund, warum es nicht überläuft, ist der gleiche Grund, warum das Hinzufügen eines kleinen Floats zu einem bereits sehr großen Float den Wert überhaupt nicht ändert - es ist ein Fließkommaformat, was bedeutet, dass die Anzahl der Stellen der Genauigkeit begrenzt ist.

Oder das Hinzufügen mindestens dieser letzten signifikanten Ziffer würde wahrscheinlich funktionieren:

%Vor%     
Groo 22.08.2017, 09:38
quelle
2

Der Grund, warum derselbe Wert zweimal ausgegeben wird, ist, dass 1.0 zu klein ist, um zu FLOAT_MAX hinzugefügt zu werden. A float hat normalerweise 24 Bits für die Mantisse und 8 Bits für den Exponenten. Wenn Sie einen sehr großen Wert mit einem Exponenten von 127 haben, benötigen Sie eine Mantisse mit mindestens 127 Bits, um 1.0 hinzufügen zu können.

Als Beispiel existiert das gleiche Problem mit Dezimal (und anderen) Exponentialwerten: Wenn Sie eine Zahl mit 3 signifikanten Ziffern wie 1,00 * 10 6 haben, können Sie ihr keine 1 hinzufügen, da dies 1'000'001 wäre, und dies erfordert 6 signifikante Ziffern.

>

Sie könnten float überlaufen lassen, indem Sie den Wert wiederholt verdoppeln.

    
alain 22.08.2017 09:42
quelle

Tags und Links