Präzision in C schwebt

8

Im Allgemeinen sagen wir, dass ein Float eine Genauigkeit von 6 Nachkommastellen hat. Aber wenn wir eine große Zahl in der Größenordnung von 10 ^ 30 speichern, erhalten wir 6 Nachkommastellen nicht. Also ist es richtig zu sagen, dass Floats eine Genauigkeit von 6 Ziffern nach dem Komma haben?

    
iceman_w 19.03.2012, 06:09
quelle

4 Antworten

10

"6 Nachkommastellen" ist nonsense, und Ihr Beispiel ist eine gute Demonstration davon.

Dies ist eine genaue Angabe des Datentyps float .

Die Genauigkeit des float ist 24 Bits. Es gibt 23 Bits, die den Bruch nach dem Binärpunkt bezeichnen, plus es gibt auch ein "implizites führendes Bit", entsprechend der Online-Quelle. Dies ergibt insgesamt 24 signifikante Bits.

In Dezimalziffern ist das ungefähr:

24 * log (2) / log (10) = 7.22

    
valdo 19.03.2012, 06:17
quelle
7

Es klingt, als würden Sie nach Dezimalstellen (Nachkommastellen) nach Präzision fragen, während signifikante Zahlen (Gesamtzahl der Ziffern ohne führende und traling Nullen) ist eine bessere Möglichkeit, die Genauigkeit der Zahlen zu beschreiben.

Sie haben Recht damit, dass sich die Anzahl der Nachkommastellen ändert, wenn die Zahl größer ist - wenn wir jedoch von Präzision sprechen, ändert sich die Anzahl der signifikanten Zahlen nicht, wenn die Zahl größer ist. Die Antwort ist jedoch nicht einfach für Dezimalzahlen:

Die meisten Systeme verwenden heutzutage das IEE-Gleitkommaformat , um Zahlen in C darzustellen. Wenn Sie es sind auf etwas ungewöhnliches, es lohnt sich zu überprüfen. Single precision IEE float Nummern bestehen aus drei Teilen:

  • Das Vorzeichenbit (ist diese Zahl positiv oder negativ)
  • Der (in der Regel auch signierte) Exponent
  • Der Bruch (die Zahl vor dem Exponenten)

Wie wir erwarten, ist dies alles in binärer Form gespeichert.

Wie viele signifikante Zahlen?

Wenn Sie IEE-754-Nummern verwenden, ist "wie viele signifikante Zahlen" wahrscheinlich keine einfache Möglichkeit, darüber nachzudenken, weil die Genauigkeit in binären Zahlen statt in Dezimalzahlen gemessen wird . float s haben nur 23 Bits Genauigkeit für den Bruchteil, aber da es ein implizites Vorlaufbit gibt (außer der Bruchteil ist Nullen, was einen Endwert von 1 anzeigt), gibt es 24 effektive Bits der Genauigkeit.

Dies bedeutet, dass 24 signifikante Binärziffern sind, was nicht zu einer genauen Anzahl dezimaler signifikanter Zahlen führt. Sie können die Formel 24 * log (2) / log (10) verwenden, um zu bestimmen, dass es 7.225 Dezimalziffern gibt, was keine sehr gute Antwort auf Ihre Frage ist, da es nur Zahlen von 24 signifikanten Binärziffern gibt haben 6 signifikante Dezimalziffern.

Gleitkommazahlen mit einfacher Genauigkeit haben also abhängig von der Zahl 6-9 signifikante Dezimalstellen der Genauigkeit .

Interessanterweise können Sie diese Genauigkeit auch verwenden, um die größte fortlaufende Ganzzahl (von Null ausgehend) zu berechnen, die Sie erfolgreich in einem Float mit einfacher Genauigkeit darstellen können. Es ist 2 ^ 24 oder 16.777.216. Sie können größere Ganzzahlen genau speichern, aber nur, wenn sie in 24 signifikanten Binärziffern dargestellt werden können.

Weitere Kleinigkeiten: Die begrenzte Größe der Fraktionskomponente ist die gleiche Sache, die dies in Javascript verursacht:

%Vor%

Javascript-Nummern werden immer als Floats mit doppelter Genauigkeit dargestellt, die 53 Bits Genauigkeit haben. Dies bedeutet, dass zwischen 2 ^ 53 und 2 ^ 54 nur gerade Zahlen dargestellt werden können, da das letzte Bit einer ungeraden Zahl verloren ist.

    
Timothy Jones 19.03.2012 06:21
quelle
6

Die Genauigkeit von Fließkommazahlen sollte in Binärziffern , nicht in Dezimalziffern gemessen werden. Dies liegt daran, dass Computer mit Binärzahlen arbeiten und ein Binärbruchteil nur einen Dezimalbruch annähern kann.

Sprachanwälte sagen, dass die genaue Breite eines float vom C-Standard nicht spezifiziert und daher implementierungsabhängig ist, aber auf jeder Plattform, auf die Sie wahrscheinlich stoßen, ein C float bedeutet ein IEEE754 Single-Precision Nummer.

IEEE754 gibt an, dass eine Fließkommazahl in der wissenschaftlichen Notation ist: (-1) s × 2 e × m
Wobei s ein Bit breit ist, e ist acht Bit breit und m ist dreiundzwanzig Bit breit. Mathematisch ist m 24 Bit breit, weil immer angenommen wird, dass das oberste Bit 1 ist.

Die maximale Anzahl der Dezimalstellen, die mit dieser Darstellung angenähert werden können, lautet also: log 10 (2 24 ) = 7.22 . Dies approximiert sieben signifikante Dezimalstellen und einen Exponenten, der von 2 <-126 bis 2 <127> reicht.

Beachten Sie, dass der Exponent separat gemessen wird. Das ist genau so, als würden Sie gewöhnliche wissenschaftliche Notation verwenden, wie "Eine Person wiegt 72,3 Kilogramm = 7,23 × 10 4 Gramm. " Beachten Sie, dass es hier drei signifikante Ziffern gibt, was bedeutet, dass die Zahl nur innerhalb von 100 Gramm genau ist. Aber es gibt auch einen Exponenten , der ganz anders ist. Sie können einen sehr großen Exponenten mit sehr wenigen signifikanten Ziffern haben, wie "die Sonne wiegt 1,99 × 10 <33> Gramm." Große Zahl, wenige Ziffern.

    
Crashworks 19.03.2012 06:22
quelle
3

Kurz gesagt, ein Float kann etwa 7-8 signifikante Dezimalziffern speichern. Lassen Sie mich das an einem Beispiel illustrieren:

%Vor%

Grundsätzlich speichert der Float zwei Werte: 1234567 und die Position des Dezimalpunkts.

Dies ist ein vereinfachtes Beispiel. Floats speichern binäre -Werte anstelle von Dezimalwerten. Ein 32-Bit-IEEE-754-Float bietet Platz für 23 "signifikante Bits" (plus das erste, das immer angenommen wird) zu 1), was etwa 7-8 Dezimalstellen entspricht.

%Vor%

Und genau das erzeugt C:

%Vor%     
Heinzi 19.03.2012 06:21
quelle

Tags und Links