d == 9000000000000000000d Endlosschleife

7

Betrachten Sie diesen Code:

%Vor%

Warum läuft der Code in einer Endlosschleife?

Warum wirft der Compiler keine Ausnahme?

    
Shahrooz Jafari 19.12.2015, 17:09
quelle

1 Antwort

19

Ein Double hat eine variierende Genauigkeit, d. h. eine feste Anzahl von signifikanten Bits.

Eine double / float Zahl (Fließkommazahl) besteht aus einem Exponenten und einer Mantisse (vgl. den IEEE754 Standard ). Die Logik besagt, dass man bei größeren Zahlen keine hohe Genauigkeit für kleine Zahlen benötigt, während man für kleine Zahlen eine hohe Genauigkeit benötigt. So kann es vorkommen, dass d==d+1 wahr ist, da +1 nichts für große Zahlen tut (das ist auch ein Grund, warum man nicht verwenden sollte Fließkommazahlen für die Darstellung von Geld ; auch der Vergleich von Fließkommazahlen ist problematisch, da 4*0.1!=0.4 in Abhängigkeit von der Implementierung und möglichen Rundungsfehlern wahr sein kann. Dies ist im IEEE754 Standard definiert und wird daher keine Ausnahme auslösen (außerdem können Compiler Warnungen oder Fehler ausgeben , aber keine Ausnahmen).

Das steht im Gegensatz zu Ganzzahlen, die immer eine Genauigkeit von 1 haben. Wenn Sie also große Zahlen mit einer Genauigkeit von 1 verarbeiten müssen, müssen Sie in Erwägung ziehen, BigInteger Implementierungen oder verwenden Sie decimal mit einem festen Satz von Dezimalziffern und garantiert Präzision.

    
MrTux 19.12.2015, 17:13
quelle

Tags und Links