Also vorneweg ich habe
gelesen und auch soweit alles verstanden.
So ein kleines Beispielprogramm:
Die Ausgabe sieht so aus:
Die erste Zeile kann ich mir erklären. 0.1 ist als Gleitkommazahl nicht genau darstellen, dadurch summiert sich der Fehler auf. Bei der zweiten Zeile entsteht der Fehler nur einmal.
Aber bei der dritten Zeile Versteh ich das nicht so genau. 1 und 10^20 kann man doch beide mit einer double genau speichern und auch genau zusammenrechnen, bzw auch wieder abziehen, warum kommt dann 0 raus?
10^20 entspricht:
1 entspricht:
Da 1 den kleineren Exponenten hat wird es bei der Subtraktion an den größeren angepasst:
So und meines Erachtens kann ich die jetzt addieren ohne das Information wegfällt. Warum kommt dann aber die Ausgabe zustande?
HTML:
http://www.java-forum.org/allgemeines/122323-ungenauigkeit-double-float-gleitkommazahlen-alternativen.html
So ein kleines Beispielprogramm:
Java:
public class GleitkommaOperationen {
public static void main(String[] args) {
double a = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1;
double b = (1+1+1+1+1+1+1+1+1+1)*0.1;
double c = 1 + Math.pow(10,20) + (-Math.pow(10,20));
double d = 1 + (Math.pow(10,20) + (-Math.pow(10,20)));
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
Die Ausgabe sieht so aus:
HTML:
0.9999999999999999
1.0
0.0
1.0
Die erste Zeile kann ich mir erklären. 0.1 ist als Gleitkommazahl nicht genau darstellen, dadurch summiert sich der Fehler auf. Bei der zweiten Zeile entsteht der Fehler nur einmal.
Aber bei der dritten Zeile Versteh ich das nicht so genau. 1 und 10^20 kann man doch beide mit einer double genau speichern und auch genau zusammenrechnen, bzw auch wieder abziehen, warum kommt dann 0 raus?
10^20 entspricht:
HTML:
VorZ Exess Mantisse
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 entspricht:
HTML:
VorZ Exess Mantisse
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Da 1 den kleineren Exponenten hat wird es bei der Subtraktion an den größeren angepasst:
HTML:
VorZ Exess Mantisse
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
So und meines Erachtens kann ich die jetzt addieren ohne das Information wegfällt. Warum kommt dann aber die Ausgabe zustande?