Datentypen Floating point Fehler

  • Themenstarter Themenstarter garfield335
  • Beginndatum Beginndatum
G

garfield335

Gast
Ich weiss nicht ob jemand hier im Forum Ahnung hat.

Aber was genau sind Floating point numbers.


Ich habe heute festgestellt dass folgender JavaCode:

[Java]
public static void main(String[] args) {
float f = 1123.15f;
DecimalFormat df = new DecimalFormat("#.000000");
System.out.println(df.format(f));

}
[/code]


Als resultat: 1123.150024 herausschreibt.


Quizfrage: Woher kommen die "24" :?:

Kann mir jemand eine Wissenschaftliche erklärung dazu geben 🙁
 
Floating point numbers speichern "Kommazahlen".

Nun kann man theoretisch vor und nach dem Komma beliebig viele Stellen haben.

Klar ist, dass man mit einem begrenzten Speicherumfang (Java float: 32 bit) nicht beliebig viele verschiedene Kommazahlen darstellen kann. (Ist ja bei int nicht anders, das geht von -2147483648 bis 2147483647 und hat auch 32 bit).

Daher werden Zahlen "krumm", weil sie auf den nächsten darstellbaren Wert "gerundet" werden.

Wie wird es nun gespeichert: Man stellt die Zahl als m * b ^ e dar (m ... Mantisse, b ... Basis, e ... Exponent). Die Basis ist in unserem Fall 2 (per Definition), wir haben nun 32 bit, die wir zwischen Mantisse und Exponent "aufteilen" können.
D.h. vorher ziehen wir noch 1 bit ab, für + oder -, und dann legen wir fest (weil das kluge Menschen von IEEE mal so gemacht haben): m bekommt 23 bits, e bekommt 8 bits.

Hier mal ein wenig Java-Code, damit wir deine Zahl in dieser Darstellung sehen:
Java:
	public static void main(String[] args) throws IOException, InterruptedException  {
		int y = Float.floatToIntBits(1123.15f);
		String s = Integer.toString(y, 2);
		if (s.length() < 32) {
			s = "0" + s;
		}
		System.out.println(s);
	}

Das sollte diesen Output erzeugen: 01000100100011000110010011001101
Das erste bit ist das Vorzeichen.
Die nächsten 8 bit (10001001) sind der exponent, wobei dieser um 127 reduziert werden muss. e = 137 - 127 = 10.
Die nächsten 23 bit sind die Mantisse, wobei die immer mit einer gedachten 1. vorangestellt läuft, d.h. wir haben m = 1,00011000110010011001101.

Die Zahl lautet also 1,00011000110010011001101 * 2^10, d.h. wir schieben das Komma um 10 nach rechts und bekommen: 10001100011,0010011001101.
Der Vorkommateil ist 10001100011 oder eben 1123
Der Nachkommateil ist: 0,0010011001101 oder 0,150024414 und daher kommt deine "krumme Zahl".
 

Zurück
Oben