Datentypen Double Maxvalue Subtraktion

Status
Nicht offen für weitere Antworten.
M

mrc

Gast
Hi leute,

bin auf folgendes gestossen:
wenn ich bei einem int valuezur maximalen grösse 1 dazuzähle, swapt das ganze aufgrund der 2-er komplementdarstellung ja auf den kleinsten negativ wert um:
Java:
int myvalue = Integer.MAX_VALUE;
System.out.println(myvalue);
		
myvalue += 1;
System.out.println(myvalue);
Ausgabe ist dann:
2147483647
-2147483648


Versuche ich dann dass ganze mit dem Datentyp double passiert folgendes:
Java:
double myvalue = Double.MAX_VALUE;
System.out.println(myvalue);
		
myvalue += 1d;
System.out.println(myvalue);
Ausgabe ist dann:
1.7976931348623157E308
1.7976931348623157E308



warum ändert sich der wert nicht(z.B.: auf Infinity)?



das phänomen wird noch deutlicher, wenn man versucht etwas zu subtrahieren:
Java:
double myvalue = Double.MAX_VALUE;
System.out.println(myvalue);
		
myvalue -= 1d;
System.out.println(myvalue);
Ausgabe ist wieder:
1.7976931348623157E308
1.7976931348623157E308




kann mir das wer erklären, warum diese rechenoperation nicht ausgeführt wird?
Übrigens, wenn ich nicht addiere oder subtrahiere, sondern multipliziere (z.b. mit 1.1 oder 0.9) wird der wert entsprechend verringert, oder im falle der multiplikation mit 1.1 auf "Infinitiy" gesetzt.

Besten Dank,
mrc
 

HanKooR

Mitglied
Also ich weiß es nicht.
Ich rate jetzt mal, dass es ein Genauigkeitsfehler ist, da es bei einer addition ab einem wert von
Java:
myvalue += Math.pow(10, 291);
in Infinity umschlägt und vorher nicht.

Evtl. liegt hier ungefähr die Größe des Rundungsfehlers bei der Floatingpoint - Berechnung für die Nachkommastellen der Basis dieser Potenz? (1.7976931348623157E308)

Kann das evtl. jmd mit "einfachen Worten" erklären :eek:
 

javimka

Top Contributor
Ja, es ist ein Rundungsfehler. Ein double ist aus 64 Bits aufgebaut. Ein Bit für das Vorzeichen, 11 Bits für den Exponenten und 52 Bits für die Mantisse. Die Mantisse bezeichned dabei eine Zahl, die zwischen 1 und 2 liegt. Diese Zahl wird mit Hilfe des Exponenten dann in den richtigen "Bereich" gebracht. Mit Bereich meine ich z.B. einen Bereich zwischen 0 und 0.00..001 oder den Bereich zwischen 1 und 10 oder den Bereich zwischen 10^6 und 10^7.
Die genaue Formel ist: (1 + Mantisse/2^52) * 2^(Exponent-1023)
Wenn jetzt irgendwas gerechnet wird, dann muss natürlich immer gerundet werden. Anders als bei Integer wird nicht strikt auf die nächst kleinste Zahl gerundet (absoluter Fehler), sondern auf die nächst beste Approximation, die double schafft (relativer Fehler). Bei einer Zahl mit 308 Nullen, wie aus deinem Beispiel, wird eine zuätzliche 1 schlichtweg abgerundet. Damit das auf infinity rundet, musst du einen orderntlichen Brocken mehr dazu addieren ;)
Bei der Multiplikation mit 1.1 Berechnest du eigentlich Zahl + Zahl/10. D.h du addierst ungefähr 10^308+10^307 und dieser Summand fällt natürlich massiv ins Gewicht, was in infinity resultiert.
 
M

mrc

Gast
ok, danke.

eure ausführungen klingen soweit ganz gut.

allerdings, zwecks fliegensh*t dazuaddieren, wenn ich eine entsprechend große zahl addiere passiert auch nix:

Java:
double myvalue = Double.MAX_VALUE;
System.out.println(myvalue);
		
myvalue += 2983743274024d;
System.out.println(myvalue);

Ausgabe:
1.7976931348623157E308
1.7976931348623157E308
 

Geeeee

Bekanntes Mitglied
Naja, deine 2.983.743.274.024 ~ 3E12 sind noch immer zu x.xE308 ein kleines "Nix"
 

Der Müde Joe

Top Contributor
kannst dich ja mal an den fliegensch**s herantasten:
Java:
public static void main(String... _) {
	double max = Double.MAX_VALUE;
	for (double d = 1;;) {
		// add 50% each time
		d *= 1.5;
		if (Double.isInfinite(max + d)) {
			System.out.println(d);
			break;
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Double or Float zusammenrechnen Java Basics - Anfänger-Themen 15
I Review von euch erwünscht, double Rechnung falsch Java Basics - Anfänger-Themen 34
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
MoxMorris Integer.MAX_VALUE und Double.MAX_VALUE Unterschied Java Basics - Anfänger-Themen 3
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
Lion.King Fehler in double und int Java Basics - Anfänger-Themen 7
F java: incompatible types: possible lossy conversion from double to int Java Basics - Anfänger-Themen 1
J Double Variable und Addition Java Basics - Anfänger-Themen 2
F Double Ausgabe nicht wissenschaftlich Java Basics - Anfänger-Themen 16
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
Kotelettklopfer Variablen Double zwingen Ganzzahlen mit 2 Nachkommastellen auszugeben Java Basics - Anfänger-Themen 10
A possible lossy conversion from double to int Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
J Transformation zweier Integer in ein Double Java Basics - Anfänger-Themen 26
N The method setSaldo(double) in the type Konto is not applicable for the arguments (int, int) Java Basics - Anfänger-Themen 2
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
V Erste Schritte Die Nuller bei double NICHT abschneiden Java Basics - Anfänger-Themen 4
Y Datentypen Double Division ungenau Java Basics - Anfänger-Themen 45
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
M Writer für unterschiedliche Obj/inbt/double erstellen? Java Basics - Anfänger-Themen 1
F Character umwandeln als Double Werte Java Basics - Anfänger-Themen 8
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
P Hilfe bei Double Java Basics - Anfänger-Themen 1
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
B HQL / Hibernate, GroupBy und Ausgabe als Double Java Basics - Anfänger-Themen 1
M Konvertierung String -> double Java Basics - Anfänger-Themen 8
A Double Scan eingrenzen Java Basics - Anfänger-Themen 2
O Erste Schritte Potenzmethode per double Java Basics - Anfänger-Themen 11
A Random Double mit Math.round() runden? Java Basics - Anfänger-Themen 1
H Double oder nicht? Java Basics - Anfänger-Themen 7
J int array als double array ausgeben Java Basics - Anfänger-Themen 9
M Int und Double in Array speichern Java Basics - Anfänger-Themen 1
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
B Hashing (verkettet/double) Java Basics - Anfänger-Themen 0
L Konvertieren von String zu double?! Java Basics - Anfänger-Themen 6
V Operatoren Warum kommt bei double bei den Nachkommastellen irgendwann eine 2?! (1.20000000000002) Java Basics - Anfänger-Themen 5
geekex Double zu String umwandeln in einer Methode Java Basics - Anfänger-Themen 28
E Bruch erstellen - Von Int zu Double Ergebnis Java Basics - Anfänger-Themen 24
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
I Double.ParseDouble 2 Textfelder Java Basics - Anfänger-Themen 1
M JComboBox feste double Werte zu ordnen Java Basics - Anfänger-Themen 8
P Datentypen Kann ich bei double Komma statt Punkt eingeben? Java Basics - Anfänger-Themen 14
E Von Double zu Long umwandeln Java Basics - Anfänger-Themen 9
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
V Variablen Double später deklarieren Java Basics - Anfänger-Themen 7
V double = 1.34823e-300 Java Basics - Anfänger-Themen 5
W double*double error Java Basics - Anfänger-Themen 4
kilopack15 Mehr Nachkommastellen mit double Java Basics - Anfänger-Themen 14
T Input/Output Double und String als Eingabe einlesen Java Basics - Anfänger-Themen 9
J [Rundungsfehler bei Double] Grundkurs Java: Checke Lösungsweg nicht Java Basics - Anfänger-Themen 1
W In einer Function<Double, Double> undefinierte Rechenoperationen abfangen? Java Basics - Anfänger-Themen 3
T set Metode für Double Java Basics - Anfänger-Themen 6
Hijo2006 String to Double Java Basics - Anfänger-Themen 4
K Double Wert runden und in Int umwandeln Java Basics - Anfänger-Themen 7
A Kommafehler beim double einleseen korrigieren Java Basics - Anfänger-Themen 2
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
das_leon String zu double konventieren Java Basics - Anfänger-Themen 1
K Genauer als Double? Java Basics - Anfänger-Themen 4
T Double.parseDouble(args[0]) Java Basics - Anfänger-Themen 13
A Java Ungenauigkeit double Java Basics - Anfänger-Themen 6
B Methoden The method mirror(double[]) in the type Convolution is not applicable for the arguments (double) Java Basics - Anfänger-Themen 8
C Typumwandlung von int<-->double Java Basics - Anfänger-Themen 6
M Double Wert auf 2 Kommastellen runden Java Basics - Anfänger-Themen 2
S Regelabfragen aus Double-Array Java Basics - Anfänger-Themen 2
A Erste Schritte Double Wert aus String zu int Java Basics - Anfänger-Themen 2
P Rückgabe erflogt nicht als Double Java Basics - Anfänger-Themen 2
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
P scanner ein Double einlesen Java Basics - Anfänger-Themen 10
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
S double[x] , double[y] zu Point[] points kopieren? Java Basics - Anfänger-Themen 15
G double in float umwandeln Java Basics - Anfänger-Themen 2
F double[] an andere Methode übergeben Java Basics - Anfänger-Themen 1
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
S Datentypen double - kommastellen abschneiden Java Basics - Anfänger-Themen 6
M int double int double Graph Java Basics - Anfänger-Themen 3
K ArrayList<Double> --> double[] array Java Basics - Anfänger-Themen 5
Z Double in komma und Punkt akzeptieren -> Robusteeingabe Java Basics - Anfänger-Themen 7
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
B Datentypen Multiplzieren mit double wird ungenau Java Basics - Anfänger-Themen 4
K Von einem Double wert nur die Zahl vor dem Komma verwenden Java Basics - Anfänger-Themen 9
F Double neu formatieren mit NumberFormat Java Basics - Anfänger-Themen 2
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
T Problem mit double-Formatierung Java Basics - Anfänger-Themen 3
M Double Zahl in Grad Zahl Java Basics - Anfänger-Themen 7
M Datentypen Ergebniss- Double to String- wird nicht angezeigt Java Basics - Anfänger-Themen 13
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
M Die Double-Variable rundet? Java Basics - Anfänger-Themen 1
llabusch Methoden Methoden überlagern - entweder int || double Java Basics - Anfänger-Themen 10
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
K Datentypen Wertebereich float/double - Warum nicht hoch -1 Java Basics - Anfänger-Themen 6
A Double[] Array zahlen per Argument übergeben Java Basics - Anfänger-Themen 5
B Erste Schritte Addition von double in switch-Anweisung Java Basics - Anfänger-Themen 2
D Unterschied zwischen double und Double Java Basics - Anfänger-Themen 4
M Double-Zahlen auf Intervalle runden Java Basics - Anfänger-Themen 3
D Schon wieder double -.- Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben