Datentypen Wertebereich float/double - Warum nicht hoch -1

knowledge

Bekanntes Mitglied
Hallo,

bei den meisten Datentypen ist ja der Wertebereich von -2 hoch n bis 2 hoch n-1, da die 0 mit eingerechnet wird.

Bei float und double ist es jedoch +- 3,40 ... *10 hoch 38 bzw. +- 1,79 ... * 10 hoch 308. Wieso wird hier nicht auch 10 hoch 38-1 bzw. 10 hoch 308-1 gerechnet wie bei den anderen Typen...
 
Ja, aber die Mantisse und der Exponent werden getrennt gespeichert. Wenn du eine genaue Angabe willst: bei foat z.B. von 2^-23 * 2^-126 bis (1-2^-24) * 2^128. Mit so einer Angabe kann niemand etwas anfangen, deshalb wandelt man es in abgeschätzte Dezimaldarstellungen um: von ca. 1.4 * 10^-45 bis ca. 3,4*10^38

Dazwischen sind aber ganz viele Zahlen nicht genau darstellenbar, sowas simples wie 0.4 zum Beispiel schon nicht.
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort. 0.4 nicht darstellbar? Da versteh ich dein Beispiel sicher falsch, weil

float a = 0.4f; kann ich ja Deklarieren/Initialisieren. Kannst du noch einmal kurz - am Bsp. - skizieren warum das nicht geht. Steh immernoch auf dem Schlauch. Danke.
 
Du kennst sicherlich die Darstellung von ganzen Zahlen: Man hat die Zweierpotenzen 1, 2, 4, 8, 16, 32, 64 usw. zur Verfügung und summiert diese, um eine Zahl darzustellen. Beispielsweise ist 19 = 16 + 2 + 1.

Bei Dezimalzahlen hat man nun binäre Brüche: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 usw.

0.4 entspricht nun dem Bruch 2 / 5. Wenn wir 1/2 nähmen, wäre das zu viel, also ist das erste Bit eine Null. 1/4 ist kleiner, also nehmen wir die - das zweite Bit ist eine 1 und es verbleiben noch 3/20. Wenn man das jetzt so weitermacht, kommt man nie zum Ende - es handelt sich um einen periodischen Bruch. Sowas wie 7/6 im Dezimalsystem, das ist auch nicht darstellbar und wird deshalb lieber als Bruch geschrieben. Das machen floats aber nicht so, sonst könnte man ja nur rationale, aber keine reellen Zahlen darstellen. Deshalb darf man floats auch nicht mit == vergleichen. Es gibt da sehr viele, schöne Beispiele, in denen das kaputtgeht, weil als gleich empfundene Zahlen intern anders berechnet wurden, die Darstellung in einem Bit abweicht und deshalb keine Gleichheit im Sinne von Java vorliegt.

Aus diesem Grund vermeidet man floats für alles, wo Genauigkeit einigermaßen wichtig ist, beispielsweise bei Banken. Dort rechnet man in Centbeträgen und nicht in dezimalen Euros. Das gleiche trifft natürlich auch für doubles zu.

Hier ist ein kleiner Rechner, wo du das mal testen kannst: IEEE 754 Converter
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben