Decrementieren mit Fehlern

Hatschi

Aktives Mitglied
Java:
public class Test   {
	public static void main(String[] args) {
		double x = 1.0;
		for(int i=0; i<100; i++) {
			x -= 0.1;
			System.out.println(x);
		}
    }
}

Ausgabe:
Code:
0.9
0.8
0.7000000000000001
0.6000000000000001
0.5000000000000001
0.40000000000000013
0.30000000000000016
...
 
G

Gast2

Gast
Was ist deine Frage?

manche Werte lassen sich nicht exakt binär speichern, daher kommen die "komischen" Werte zustande.
 
M

maki

Gast
EikeB hat recht, Fliesskommazahlen sind immer ungenau, liegt an der Hardware und nicht an der Programmiersprache.
 

Hatschi

Aktives Mitglied
elegante Lösung?
Java:
public class Test   {
    public static void main(String[] args) {
        double x = 1.0;
        int y = 100;
        for(int i=0; i<100; i++) {
            y -= 1;
            x = (double)y/100;
            System.out.println(x);
        }
    }
}
 

eRaaaa

Top Contributor
elegante Lösung?

Wenn sie funktioniert ist doch alles gut :)
Kürzer schreiben kann mans ja immer noch
(
Code:
y -= 1;[/c] --> [c]y--;
&
Code:
x = (double)y/100; [/c]--> [c] x = y/100.;
zum Beispiel)

oder
Java:
		for (int i = 99; i >= 0; i--) {
			double x = i / 100.; //oder eben direkt in die nächste zeile :-)
			System.out.println(x);
		}

oder
.......
 

Landei

Top Contributor
EikeB hat recht, Fliesskommazahlen sind immer ungenau, liegt an der Hardware und nicht an der Programmiersprache.

Fließkommazahlen sind manchmal auch genau. 1/2, 1/4 oder 57/65536 lassen sich ganz genau speichern, und werden beim Aufsummieren auch nie solche Fehler bringen.

Und die Ungenauigkeiten liegen weder an der Programmiersprache, noch an der Hardware, sondern einfach an der Mathematik und der Tatsache, dass wir für das Speichern von Zahlen nicht beliebig viel Platz verwenden können. Stell dir vor, die Zahlen wären im normalen Zehnersystem gespeichert, und mit 10 Nachkommastellen. Nun rechnen wir 1/3 + 2/3, aber statt 1 erhalten wir:

0.3333333333
0.6666666666
-------------
0.9999999999

Genau das passiert im Rechner, nur im Zweier-System (Binär- oder Dualsystem). 0.1 ist dort nicht exakt darstellbar, genauso wie 1/3 im Zehnersystem nicht exakt darstellbar ist. Rechnen wir es einfach aus:
Code:
10 dezimal = 1010 binär

1.000000000 / 1010 = 0.0110011001100110...
 -1010
------  
  01100
  -1010
  -----
     10000
     -1010
     -----
      0110
      ...

Wenn man diese Zahl mit 1010 (binär) multipliziert, kommt 0.1111111111.... (binär) heraus, was zu denselben Effekten wie im Zehnersystem führt.
 
Zuletzt bearbeitet:
M

maki

Gast
Und dui Ungenauigkeiten liegen weder an der Programmiersprache, noch an der Hardware, sondern einfach an der Mathematik und der Tatsache, dass wir für das Speichern von Zahlen nicht beliebig viel Platz verwenden können.
War wohl etwas ungenau, auch wenn es in der Mathematik doch das Konzept der Periodität gibt, oder?

Binärsysteme gibt es viele, du meinst das Dualsystem, ansonsten stimme ich dir zu.
 

Landei

Top Contributor
Das würde ich gerne sehen, ich kenne nur eine Methode, Kommazahlen als Binärzahlen darzustellen (sieht man einmal von Feinheiten wie Exponentialschreibweise u.s.w. ab).

Natürlich sind andere Codierungen mit 0 und 1 möglich (z.B. Fibonacci-Codierung oder Gray-Code), aber sowas meinst du sicher nicht, oder?
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben