So ändern Sie Double um das kleinste Inkrement

7

Ist etwas kaputt oder ich verstehe nicht, was passiert?

%Vor%

Mit Ausgabe:

%Vor%     
Margus 10.10.2010, 13:16
quelle

5 Antworten

8

Die allgemeine Idee ist, zuerst die doppelte in ihre lange Darstellung zu konvertieren (mit doubleToLongBits wie in getRealBinary ), die Länge um 1 zu erhöhen und schließlich die neue lange wieder in die doppelte umzuwandeln, die sie über% repräsentiert co_de%.

BEARBEITEN: Java (seit 1.5) liefert longBitsToDouble , womit ich schätze, dass Sie direkt den nächst höheren Wert berechnen können: Math.ulp(double) .

    
Marcelo Cantos 10.10.2010, 13:24
quelle
7

Fließkommazahlen werden nicht gleichmäßig über die Zahlenzeile verteilt, wie ganzzahlige Typen. Sie sind dichter gepackt nahe 0 und sehr weit entfernt, wenn Sie sich der Unendlichkeit nähern. Daher gibt es keine Konstante, die Sie zu einer Gleitkommazahl hinzufügen können, um zur nächsten Gleitkommazahl zu gelangen.

    
Mark Byers 10.10.2010 13:21
quelle
4

Ihr Code ist nicht gut formatiert. Sie versuchen, den minimalen doppelten Wert hinzuzufügen und erwarten, dass das Ergebnis vom ursprünglichen Wert abweicht. Das Problem ist, dass double.MinValue so klein ist, dass das Ergebnis gerundet ist und nicht beeinflusst wird.

Vorgeschlagener Messwert: Ссылка

Im Wikipedia-Artikel gibt es auch den Java-Code. Epsilon ist definitionsgemäß die kleinste Zahl wie (X + eps * X! = X), und eps * X heißt "Relativ-Epsilon"

    
quelle
2

Seit Java 1.8 ist java.lang.Math.nextUp(double) genau das was du willst. Es gibt auch gegenüber java.lang.Math.nextDown(double) .

    
Maciej Mikosik 17.05.2017 13:30
quelle
0

Wenn Sie die BigDecimal-Klasse verwenden möchten, gibt es auch die Methode BigDecimal.ulp() .

    
Matthias 18.09.2013 10:06
quelle

Tags und Links