Datentypen float-Grenzen (?)

Ilker

Mitglied
Hallo Community,

mal ne ganz anfängerhafte Frage. In einem Buch steht

float a =–16777217F;
float b =16777216F;
float c =1F;
System.out.println( a + b + c ); // 1.0
System.out.println( a +(b + c)); // 0.0

mit der Erklärung: Mathematisch ergibt –16777217 + 16777216 den Wert –1, und –1 plus +1 ist 0. Im zweiten Fall liefert –16777217 + (16777216 + 1) = –16777217 + 16777217 = 0. Doch Java wertet a + b durch die Beschränkung von float zu 0 aus, sodass mit c addiert, also 1, die Ausgabe 1 statt 0 erscheint.

Das kam mir aber doch merkwürdig vor und ich habe es getestet und tatsächlich ergibt a + b + c "1.0" als Ergebnis. Das finde ich komisch und die Erklärung mit der "Beschränkung von float" verstehe ich auch nicht, da die float-Grenzen nach offizieller Spezifikation so aussehen:

4 bytes, IEEE 754. Covers a range from 1.40129846432481707e-45 to 3.40282346638528860e+38 (positive or negative)

Außerdem würde der negative Ast bei 2^31 spielend mit der Zahl –16777217, das bei 2^24 liegt, doch spielend zurecht kommen! Scheinbar funktionieren Gleitkommazahlen anders als ich weiß. Kann mir jemand da raushelfen? Danke!
 

MWin123

Bekanntes Mitglied
Stark vereinfachtes Beispiel:

Nehmen wir an du kannst 4 Bits speichern.
Die größte mögliche Zahl ist dann 1111 (15).

Nun rechnst du 1111 (15) + 1 (1) = 10000 (16).
Jedoch hast du nun eine 5 Bit Zahl, obwohl nur 4 Bits gespeichert werden können.
Daher geht das erste Bit verloren (Überlauf) und du erhälst 0000 = 0.
 

Ilker

Mitglied
Danke für die schnelle Antwort MWin!

Deine Aussagen sind natürlich richtig, allerdings hat float ganze 4 Bytes und somit übersteigt rein Bitzahlmäßig die Darstellungsmöglichkeit die Zahl 16777217 bei Weitem! Jedoch habe ich mir die Kodierung für Gleitzahlen, und speziell für float in Java, nochmal angeschaut und habe erfahren, dass sowohl das Vorzeichen (1 bit) wie auch die Mantisse (8 bit) in einen float mit aufgenommen wird (was ja auch Sinn macht). Damit reduziert sich die Bitanzahl allerdings schon auf 32 - 9 = 23. Allerdings habe ich mit 2^23 = 8388608 für den Wert ohne Mantisse und Vorzeichen ein Problem, denn die Grenze für float ist nach dem Beispiel ja 16777217 = 2^24, also woher kommt das zusätzliche Bit denn her :), bzw. wo ist mein Denkfehler?
 

Ilker

Mitglied
Oh cool JStein, die Idee hatte ich noch nicht, danke! :D. Also 2^24 ist definitiv float-Grenze! Wie ich aber oben schon berechnet habe bleibt nach Abziehung von Vorzeichen (1 bit) und Mantisse (8 bit) nur noch 32 - (1 + 8) = 23 bits für die Darstellung des Zahlwertes, also müsste die float-Grenze doch bei 2^23 sein..
 

JStein52

Top Contributor
Die folgenden werte:
float a = 16777217F;
float b = 16777216F;
float c = 1F;

ergeben folgenden Output:

a: 1.6777216E7 b: 1.6777216E7 c: 1.0

Ich verstehe es gerade auch nicht.
 

MWin123

Bekanntes Mitglied
Beispiel in Java:

Java:
float a = -16777217F;
float b = -16777216F;
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(a)));
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(b)));
System.out.println(a == b);
Code:
11001011100000000000000000000000
11001011100000000000000000000000
true
 

Ilker

Mitglied
Die Berechnungen im Link sind sehr interessant, nur verstehe ich die gerade noch nicht richtig. Gib da mal bitte der Reihe nach die Zahlen von 1 bis z.B. 4 ein und schau dir die binäre Darstellung an.. da sag ich mir ernsthaft WTF?? Irgendwie komm ich in die Darstellung der float-Zahlen nicht rein, vielleicht kommts noch :)
 

JStein52

Top Contributor
@Ilker: du musst bei der Mantisse die Wertigkeit der einzelnen Bits beachten, ist so in einem Nebensatz versteckt !! Und die 1 ist immer implizit davor ! Deshalb ist bei allen ZweierPotenzen die Mantisse 0 (wenn ich es richtig verstanden habe)
 

Ilker

Mitglied
oooohah... abgefahren.. da muss ich mich mal reinfuchsen, wenn ich Zeit und Lust darauf habe.. wenn man diese IEEE 754 Darstellung (die sicher ganz toll ist) nicht kennt und mal mit dem Spielzeug aus deinem Link spielt kommt man nur noch mehr zur Verwunderung.. naja irgendwann :)
 

Ilker

Mitglied
also ich habe ja schon etwas Systematik herausgefunden, aber wild bleibt es bei mir trotzdem erstmal.
warum ist beim Exponenten z.b. die 2^0 = 1 mit der Bitbelegung 127 repräsentiert und 2^1 mit 128?
und in Verbindung mit dem Exponenten 1 (Bitbelegung 127) bekomme ich den Wert 1,5 wenn icn den obersten Bit bei der Mantisse setze. Jedes weitere Bit bei der Mantisse abwärts hälftet den 0.5 Anteil bei 1 .. also ziemlich wilde Systematik. Da muss ich erstmal nen Artikel lesen oder sowas.
 

Ilker

Mitglied
Das mit dem Bias im Exponenten habe ich auch gerade nachgelesen. Die Mantisse verstehe ich noch nicht ganz, bis auf die Tatsache, dass sie zwischen 1 <= m < 2 ist und mit jedem gesetzten Bit "weiter nach unten" zu der 1 noch die Hälfte des Vorgängerwertes dazukommt (wird ja im Wikipedia-Artikel erklärt). Wie man auf diese Darstellung der Mantisse kommt muss ich mir noch zugemüte führen. Scheinbar lassen sich damit ganz toll ganz viele Gleitkommazahlen darstellen :)
 

JStein52

Top Contributor
Ja, was da gemacht wird habe ich inzwischen verstanden aber nicht warum man das so macht ? Vielleicht hatte der zuständige Entwickler auch nur schlecht geträumt an dem Tag.
 

MWin123

Bekanntes Mitglied
Hast du eine bessere Idee, wie man möglichst viele verschiedene Gleitkommazahlen zwischen ~1.4E-45 und ~3.4E38 mit nur 32 Bit darstellen kann?

Mit IEEE 754 sind es 4.261.412.864 verschiedene Zahlen.
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Mit 32 Bit hast du 2^32 Kombinationsmöglichkeiten und das sind 4 GByte. (4.294.967.296 um genau zu sein.) Und die Frage ist halt was repräsentiert jede dieser Kombinationen. Ich habe da keine bessere Idee sondern mich würde einfach interessieren warum hat man sich auf genau diese Darstellung geeinigt? Kann man damit besonders einfach rechnen ? Lässt sich das in der CPU besonders gut in Hardware umsetzen ? Oder geht es nur darum möglichst viele Werte darzustellen ?
 

JStein52

Top Contributor
Ja, was repräsentiert wird ist klar. Und ich weiss auch wie die Umwandlung geht. Die Frage war ja nur warum hat man genau diese Art des Exponenten gewählt, bzw. genau diesen Aufbau der Mantisse ? Aber ich muss ja nicht alles wissen :):):)In dem Wiki-Beitrag wird immerhin schon mal erwähnt dass damals bei dem Normungsprozess auch eine Alternative diskutiert wurde. Aber egal, ist eine rein akademische Diskussion und hier nicht von praktischer Bedeutung
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Double or Float zusammenrechnen Java Basics - Anfänger-Themen 15
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B String to Float Java Basics - Anfänger-Themen 27
A Negative float Werte? Java Basics - Anfänger-Themen 10
J Float Frage Java Basics - Anfänger-Themen 1
K Überprüfen ob Eingabe ein Float ist Java Basics - Anfänger-Themen 4
V Variablen Genauigkeit von float Java Basics - Anfänger-Themen 3
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
MiMa String nach float Konvertieren Java Basics - Anfänger-Themen 23
S Math.ceil für float Java Basics - Anfänger-Themen 1
T Kann erbende Klasse Attribute der vererbenden Klasse anpassen (int -> float)? Java Basics - Anfänger-Themen 9
J Array zu float Java Basics - Anfänger-Themen 6
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
C Erste Schritte Eingabe mit Float Java Basics - Anfänger-Themen 1
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
M Datentypen Integer und Float Konflikt Java Basics - Anfänger-Themen 3
N Mehrdimensionales float Array aus .txt-Datei einlesen? Java Basics - Anfänger-Themen 17
V Datentypen Position mit Int und Float berechen und ausgeben Java Basics - Anfänger-Themen 5
G double in float umwandeln Java Basics - Anfänger-Themen 2
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
P Variablen 2D float unterteilen Java Basics - Anfänger-Themen 3
W Variablen float rundet beim Bruch rechnen Java Basics - Anfänger-Themen 3
M Erste Schritte float-Array auslesen Java Basics - Anfänger-Themen 4
S byte to float Java Basics - Anfänger-Themen 4
K Datentypen Wertebereich float/double - Warum nicht hoch -1 Java Basics - Anfänger-Themen 6
J Falsche Darstellung von Float Java Basics - Anfänger-Themen 2
1 float Array deklarieren Java Basics - Anfänger-Themen 10
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
N Methoden String to Float Java Basics - Anfänger-Themen 3
G Queue mit int oder float Java Basics - Anfänger-Themen 3
Luk10 Unpräzise float-Werte Java Basics - Anfänger-Themen 10
U Nachbarzahl einer Float Java Basics - Anfänger-Themen 4
R Float Wertebereich Java Basics - Anfänger-Themen 3
V Double schneller als Float? Java Basics - Anfänger-Themen 13
T float[] in float Fehler Java Basics - Anfänger-Themen 6
P Einem Double-Objekt einen float-Wert zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Float ohne .0 ausgeben, sonstige Nachkommastellen aber erhalten Java Basics - Anfänger-Themen 4
K aus String mach Float funktioniert nicht warum? Java Basics - Anfänger-Themen 7
C Probleme mit float und int Java Basics - Anfänger-Themen 3
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
M String Datei in Float-Matrix umwandeln Java Basics - Anfänger-Themen 8
M float/double Anzahl Nachkommastellen ermitteln Java Basics - Anfänger-Themen 18
K float to String Java Basics - Anfänger-Themen 11
T Fehler beim Konvertieren (String --> Float) Java Basics - Anfänger-Themen 5
C Falsches Ergebnis float-Addition Java Basics - Anfänger-Themen 10
N Datentypen Warum Compilerfehler bei float f = 4.0; Java Basics - Anfänger-Themen 2
X Float ausgeben Java Basics - Anfänger-Themen 3
B Datentypen char, int, float in String Variable speichern Java Basics - Anfänger-Themen 4
M Float und double Java Basics - Anfänger-Themen 11
S Datentypen float statt void Java Basics - Anfänger-Themen 3
J String => Float Problem Java Basics - Anfänger-Themen 10
C Datentypen Float und Double Java Basics - Anfänger-Themen 2
M Float auf bestimmte Nachkommazahl runden Java Basics - Anfänger-Themen 3
D Datentypen Parse float[] to int[] Java Basics - Anfänger-Themen 4
S Long und Float Frage Java Basics - Anfänger-Themen 2
lenniii float[] Java Basics - Anfänger-Themen 2
S casten array in int von float Java Basics - Anfänger-Themen 5
P float Eingabe wird nicht akzeptiert, obwohl Variable als float deklariert Java Basics - Anfänger-Themen 2
M Vergleich Float-, Doublewert Java Basics - Anfänger-Themen 10
F Array in double/float Java Basics - Anfänger-Themen 4
A text mit float ausgeben Java Basics - Anfänger-Themen 14
G float - Frage Java Basics - Anfänger-Themen 2
G Float schneidet nach dem Rechnen auf eine Stelle ab Java Basics - Anfänger-Themen 9
G String zu float oder int Java Basics - Anfänger-Themen 3
P Float wisenschaftliche Ausgabe/Exponenten Java Basics - Anfänger-Themen 2
G Float Nachkommazahlen vergleichen Java Basics - Anfänger-Themen 7
G PRoblem mit rekursiver float additions methode Java Basics - Anfänger-Themen 9
O Object in Float konvertieren Java Basics - Anfänger-Themen 2
F bei einem Float nur x Stellen nach dem Komma anzeigen ? Java Basics - Anfänger-Themen 7
D Formatierung: ganzzahlige Float Werte nach Int Java Basics - Anfänger-Themen 2
V Exponentieren mit Exponenten vom Typ float Java Basics - Anfänger-Themen 2
J einlesen von datei, float und array und und und. Java Basics - Anfänger-Themen 7
B Vector nach float[] casten Java Basics - Anfänger-Themen 6
S float in int umwandeln? Java Basics - Anfänger-Themen 4
N String -> float Java Basics - Anfänger-Themen 3
M Float-Zahl auf x Stellen beschränken Java Basics - Anfänger-Themen 6
M Problem mit float und nullzuweisung Java Basics - Anfänger-Themen 15
M Float in String umwandeln Java Basics - Anfänger-Themen 9
G float in int wandeln Java Basics - Anfänger-Themen 2
H float Java Basics - Anfänger-Themen 3
K Eingabe von float werten Java Basics - Anfänger-Themen 4
sambalmueslie Float.parseFloat Java Basics - Anfänger-Themen 5
G Frage zur Objekt-Wrapper Float ? Java Basics - Anfänger-Themen 6
R float Variable aus String Java Basics - Anfänger-Themen 8
D HILFE bei float to String Java Basics - Anfänger-Themen 6
& String to Float Java Basics - Anfänger-Themen 7
G Frage zur Eingabe von Float ? Java Basics - Anfänger-Themen 4
G float-Array _ohne_ Arrays.sort sortieren Java Basics - Anfänger-Themen 5
W String into Float Java Basics - Anfänger-Themen 7
D Zahlen von Typ float aus einer Textdatei lesen Java Basics - Anfänger-Themen 2
R switch erlaubt keine float/double-Rechnung Java Basics - Anfänger-Themen 5
S Dumme Frage... String in Float umwandeln Java Basics - Anfänger-Themen 10
M Char to Float umwandeln. Java Basics - Anfänger-Themen 4
W nach Eingabe prüfen: ob int, double,float,... Java Basics - Anfänger-Themen 3
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
S Array Grenzen-Exception Java Basics - Anfänger-Themen 11
D Grenzen eines Applets Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben