2012-10-10 8 views
9

Die Beschreibung für Typ float in C erwähnt, dass die Anzahl der signifikanten Stellen 6 ist. AllerdingsAnzahl der signifikanten Stellen für einen Fließkommatyp

float f = 12345.6; 

und dann printf mit dem Druck() nicht 12345.6 druckt, druckt es 12345.599609. Was bedeutet "6 signifikante Ziffern" (oder "15 im Fall eines double") für einen Fließkommatyp?

+8

Beachten Sie, dass Fließkommatypen nicht in der Basis 10 gespeichert sind, daher ist die Anzahl der signifikanten * Dezimal * -Ziffern notwendigerweise eine Annäherung. –

+2

Tatsächlich gibt es 8 Bits für exp und 23 Bits für Frac. – halfelf

Antwort

10

Gemäß der standard können nicht alle Dezimalzahlen genau im Speicher abgelegt werden. Je nach Größe der Darstellung kann der Fehler ein bestimmtes Maximum erreichen. Für float ist dies 0.0001% (6 signifikante Ziffern = 10^-6 = 10^-4 %).

In Ihrem Fall ist der Fehler (12345.6 - 12345.599609)/12345.6 = 3.16e-08 weit niedriger als der maximale Fehler für Floats.

16

6 signifikante Ziffern bedeutet, dass der maximale Fehler ca. +/- 0,0001% beträgt. Der einzelne Gleitkommawert hat tatsächlich etwa 7,2 Stellen der Genauigkeit (source). Dies bedeutet, dass der Fehler etwa +/- 12345.6/10^7 = 0.0ist. Welches ist in der Reihenfolge Ihres Fehlers (0,000391).

0

Das Problem hier ist, dass Sie nicht sicher sein können, dass eine Nummer in einem Float gespeichert werden kann. Sie müssen diese Zahl mit Mantisse, Basis und Exponent darstellen, wie IEEE 754 erklärt. Die Nummer printf(...) zeigt Ihnen, dass es sich um die echte Float-Nummer handelt, die gespeichert wurde. Sie können eine Anzahl von signifikanten Ziffern in einer Gleitkommazahl nicht sicherstellen.

7

Was Sie sehen, ist nicht wirklich ein Problem mit signifikanten Ziffern, sondern die Tatsache, dass Zahlen auf einem Computer binär gespeichert sind, und es gibt keine endliche Binärdarstellung für 3/5 (= 0.6). 3/5 im Binärformat sieht aus wie 0,100110011001 ..., mit dem "1001" Muster für immer zu wiederholen. Diese Sequenz entspricht 0,599999 ... Wiederholung. Sie erhalten tatsächlich drei Dezimalstellen vor dem Dezimalpunkt, bevor ein Fehler in Bezug auf die Genauigkeit eintritt.

Dies ist ähnlich, wie es keine endliche Basis-10-Darstellung von 1/3 gibt; Wir haben 0.3333 für immer wiederholen.