Variablen Genauigkeit von float

vjung

Aktives Mitglied
Java:
public class Hello
{
public static void main(String[] args)
{
    float x = -1283.56789f, y = 9.87654321f;
    double a = 3., b = .2;

    System.out.printf("%f // %.2f // %12.4fab%%\n", x, y, x);
    System.out.printf("%8.2f // %+-12.3f // %.3f\n", a, b, a);
    System.out.printf("Achtung: %6f %.6f\n", a, a);
}
}
$ java Test
-1283,567871 // 9,88 // -1283,5679ab%
3,00 // +0,200 // 3,000
Achtung: 3,000000 3,000000


Frage:

Warum wird in der Ausgabe für
System.out.printf("%f // %.2f // %12.4fab%%\n", x, y, x);
$ java Test
-1283,567871 // 9,88 // -1283,5679ab%
angezeigt, anstatt
System.out.printf("%f // %.2f // %12.4fab%%\n", x, y, x);
$ java Test
-1283,567890// 9,88 // -1283,5679ab%

Was ich zu wissen glaube ist: bei der printf werden, wenn nicht in %f anders angegeben, immer mindestens 6 Nachkommastellen für float und double Zahlen angezeigt. Somit wäre ja 3.0 in %f dann 3.000000 (Wie in dem Code in letzter Zeile "Achtung....")
Wieso wird hier dann jedoch nicht auch x in der Ausgabe mit Nullern aufgefüllt. Woher kommen diese Nachkommastellen auf einmal?
 
Zuletzt bearbeitet:
Das liegt an der Darstellung vom float 32 Bit davon 1 Vorzeichen Bit 8 Bit Exponent (in Exzess Darstellung) und 23 Bit Mantisse
Die das sieht dann so aus VZ Mantisse*2^Exponent.
Also nichts anderes wie wenn du z.B. 1,3*10^-3 =0,0013 im Dezimalsystem
1(VZ) 10001001 (Exponet) 01000000111001000101100 (Mantisse) So sieht deine Zahl Binär dargestellt aus!
Durch die Umwandlung in eine 32Bit Binär Zahl geht Information verloren nicht zwingend aber in diesem Fall schon.
Führende der Mantisse 1 wird nicht gespeichert!
 
Ich Probiers mal einfacher 😀
Die Zahl 43,75 ist ja 4*10¹+3*10⁰+7*10⁻¹+5*10⁻².
Binär funktioniert das gleich 101011,11 ist 1*2⁵+0*2⁴+1*2³+0*2²+1*2¹+1*2⁰+1+2⁻¹+1*2⁻²
2⁻¹ = 1/2¹ = 1/2 = 0,5;
2⁻²=1/2²= 1/4=025;
2⁻³ = 1/8 = 0,125usw.
Die Zahl wird dann normalisiert d.h. das Komma wird so lange verschoben bis nur mehr eine 1 vorm Komma steht.
Dezimal 4,375 * 10¹ Binär 1,0101111 * 2⁵ die Zahlen nachdem Komma werden in der Mantisse gespeichert.
Die Hochzahl gibt an wie weit das Komma verschoben wurde und wird im Exponent gespeichert
Es kann nun passieren das du binär mehr Stellen brauchen würdest, um die Zahl akkurat darzustellen, als du zur Verfügung hast. Sobald du mehr als 23 Stellen nach dem Komma hast kann nicht mehr alles gespeichert werden.
Die Stellen die nicht mehr in die Zahl passen werden dann ins Nirvana geschoben 😀
Deswegen stehn da manchmal andere Zahlen drin wie man wollte
Ich hoffe das machts nicht noch schlimmer
http://www.binaryconvert.com/ hier kannst du mal sehen wie die umgewandelten Zahlen aussehen
 
Zuletzt bearbeitet:

Zurück
Oben