Verständnisfrage zu Genauigkeit von float und double



  • hallo zusammen.
    Ich bin relativ frisch dabei C zu lernen (mit dem Buch: C von A bis Z, was mir nebenbei gesagt sehr gut gefällt ). Also zu meinem Problem: In dem Buch steht, dass float eine Genauigkeit von etwa 6 oder 7 signifikanten Stellen hätte. Double dagegen 15. Was genau ist damit gemeint? 6 Stellen vor dem Komma? oder nach dem Komma? oder beides zusammen? Ich verstehe das nicht. Wie ist das gemeint? Im Buch steht, dass die zahl 1234,12345 und 1234,12399 nicht unterscheidbar sind (bei float). Wieso nicht? Heißt das, float kann nur 6 Stellen insgesamt unterscheiden(zeigt aber mehr an) -> hier also 1234,12? Zumal er ja auch bei großen Zahlen trotzdem 6 Stellen nach dem komma anzeigt: 112340,128940 (float); 112340,134808 (double), wobei der float Wert ja laut dem Buch falsch sein soll....
    Wäre echt nett, wenn mir mal jemand etwas auf die Sprünge helfen könnte.
    gruß
    fireball



  • Die signifikante Dezimalstellen einer Zahl erhällst du, indem du alle Ziffern
    von Links durchgehst und bei der ersten Ziffer, die nicht 0 ist, zu zählen
    beginnst. 123 hat also 3, 0.070123 dagegen 5 signifikante Dez.stellen.
    Wenn du float-Zahlen betrachtest, schaust du dir also nur die ersten 6 oder 7
    Stellen an. Wenn unterscheidungen erst in den hinteren Stellen auftreten, sind
    die Zahlen für den Rechner trotzdem gleich.



  • Die float und die double Darstellung von Zahlen folgen der IEEE 754-1985.
    Norm.

    Diese definiert das Gleitkommazahlen dargestellt werden bestehend aus einer Mantisse und einem Exponenten beide sind Vorzeichenbehaftet. Die Anzahl der Bits
    sind wie folgt definiert

    single precision 1 Bit Vorz. 8 Bit Exponent, 23 Bit Mantisse ohne führende Null
    d.h. 123.456 wird als .123456 exp3 dargestellt

    double precision 1 Bit Vorzeichen 11 Bit Exponent 52 Bit Mantisse ohne führende Null

    mit den 23 Bit in der Mantisse kann man somit maximal 6 Stellen im dezimalsystem darstellen mit 52 Bit in der Mantisse kommt man auch 16 Dezimalstellen

    teilweise gibt es noch compiler die long double anbieten diese ist 10 Byte Lang und hat 19 Dezimalstellen.



  • PAD, du meinst, er versteht dich, wenn er noch nichtmal weiß, was signifikante Stellen sind?



  • hallo zusammen,
    vielen dank erstmal. @Taurin: tolle Erklärung. 👍
    @PAD: ebenfalls toll erklärt. Nur hatte ich das auch so gelesen (nur nicht so richtig verstanden 😉 ).
    Also, wenn ich Taurin richtig verstanden habe, dann funktioniert das folgendermaßen: Bsp: 1234,12345 (float "sieht" nur 1234,12?) und 1234567 (float sieht hier nur 123456?)
    Ist das korrekt?
    Gruß
    fireball



  • Fast. Die Zahlen werden im Binärsystem gespeichert. Die binäre Stellenanzahl
    kann man aber nicht exakt ins Dezimalsystem umrechnen. Deswegen spricht man
    auch immer von 6-7 Dezimalstellen - da kann man sich nicht sicher sein, solange
    man nicht anfängt, die jeweilige Zahl ins Binärsystem umzurechnen.

    Und: 123456789 sieht dann als float-Zahl aus wie 123456?0. ? ist entweder gleich 0 oder gleich 7, dazu müsste man anfangen rumzurechnen 🙂


Anmelden zum Antworten