Verwendung von Double.POSITIVE_INFINITY in for-Schleife (Java)

8

Wie würde sich der folgende Code verhalten, besonders wenn der Doppelzähler seine Grenze erreicht ((2-2 ^ -52) · 2 ^ 1023)?

%Vor%

Würde sich dieser Code wie erwartet verhalten (Schleife für immer) oder an einem bestimmten Punkt fehlschlagen und warum?

Danke.

    
Samir 04.11.2015, 18:46
quelle

2 Antworten

5

Dieser Code wird niemals die Schleife verlassen.

Der Grund dafür ist, dass das Hinzufügen von 1 zu einer ausreichend großen double -Nummer seinen Wert nicht ändert:

%Vor%

Demo.

Wenn der Wert von double der positiven Unendlichkeit ausreichend nahe kommt, müssen Sie eine Zahl weit über 10 200 hinzufügen, um Ihren großen doppelten Änderungswert zu erhalten und% co_de zu werden %.

Der Grund dafür ist, dass POSITIVE_INFINITY für große Zahlen steht. Sie verwendet eine kurze Mantisse , um die höchstwertigen Stellen des Werts darzustellen, und einen Exponenten, der angibt, wo der Bruchpunkt platziert werden soll. Bei sehr großen Zahlen ist der Exponent im Wesentlichen ein Hinweis darauf, wie viele Nullen nach der binären Darstellung der Mantisse hinzugefügt werden müssen.

Um den Wert für double number durch Addition zu ändern, müssen Sie eine Zahl hinzufügen, die mindestens so groß wie das niedrigstwertige Bit der Mantisse ist. Sobald der binäre Exponent über 48 steigt, wird die kleinste Zahl, die Sie hinzufügen müssen, damit das Ergebnis anders ist, 2, was bedeutet, dass double den Wert nicht mehr ändern würde.

    
dasblinkenlight 04.11.2015, 18:56
quelle
6

Irgendwann wird i++ keinen Effekt mehr haben, denn für sehr große Werte von i sind aufeinanderfolgende double -Werte weit voneinander entfernt.

Daher ist es eine Endlosschleife.

Um zu beweisen, dass es double Werte gibt, für die i == i + 1 Folgendes versuchen:

%Vor%

Es druckt

%Vor%     
Paul Boddington 04.11.2015 18:53
quelle

Tags und Links