‘float’ vs. ‘double’ präzision

Lesezeit: 4 Minuten

Benutzeravatar von foo
foo

Der Code

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

wird Ihnen die Ausgabe geben

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

wo in der dritten Zeile der Ausgabe 741012573242 ist Müll und in der vierten Zeile 116 ist Müll. Haben Doubles immer 16 signifikante Stellen, während Floats immer 7 signifikante Stellen haben? Warum haben Doubles keine 14 signifikanten Ziffern?

Benutzeravatar von Alan Geleynse
Alan Geleynse

Fließkommazahlen in C verwenden IEEE754 Codierung.

Diese Art der Kodierung verwendet ein Vorzeichen, einen Signifikanten und einen Exponenten.

Aufgrund dieser Codierung weisen viele Zahlen kleine Änderungen auf, damit sie gespeichert werden können.

Außerdem kann sich die Anzahl signifikanter Stellen leicht ändern, da es sich um eine binäre Darstellung handelt, nicht um eine dezimale.

Einfache Genauigkeit (Float) gibt Ihnen 23 Bit Signifikant, 8 Bit Exponent und 1 Vorzeichenbit.

Doppelte Genauigkeit (double) gibt Ihnen 52 Bit Signifikant, 11 Bit Exponent und 1 Vorzeichenbit.

  • C99 schon, vorher war es Sache des Compilers.

    – Alan Geleynse

    23. Februar 2011 um 23:29 Uhr

  • -1 Diese Aussage ist offensichtlich falsch: “Aufgrund dieser Kodierung können Sie niemals garantieren, dass sich Ihr Wert nicht ändert.”

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    23. Februar 2011 um 23:46 Uhr

  • @Alan: C99 erfordert kein IEEE-Gleitkomma; es wird nur empfohlen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    23. Februar 2011 um 23:47 Uhr

  • @Alan: Unter IEEE 754 ist leicht garantiert, dass sich die Werte nicht ändern 0.5, 0.046875oder 0.376739501953125 gegenüber ihren dezimalen Darstellungen. (Dies sind alles diadische Rationalzahlen, bei denen der Zähler in die Mantisse passt und der Logarithmus zur Basis 2 des Nenners in den Exponenten passt.)

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    24. Februar 2011 um 1:12 Uhr

  • Die 53 Bit von doubles geben etwa 16 Stellen Genauigkeit. Die 24 Bit von floats geben etwa 7 Stellen Genauigkeit.

    – Ikegami

    7. Januar 2018 um 21:44 Uhr

Haben Doubles immer 16 signifikante Stellen, während Floats immer 7 signifikante Stellen haben?

Nein. Doubles haben immer 53 Signifikanz Bits und Schwimmer haben immer 24 signifikant Bits (mit Ausnahme von Denormalen, Unendlichkeiten und NaN-Werten, aber das sind Themen für eine andere Frage). Dies sind Binärformate, und Sie können nur eindeutig über die Genauigkeit ihrer Darstellungen in Form von Binärziffern (Bits) sprechen.

Dies ist analog zu der Frage, wie viele Ziffern in einer binären Ganzzahl gespeichert werden können: Eine vorzeichenlose 32-Bit-Ganzzahl kann Ganzzahlen mit bis zu 32 Bit speichern, was nicht genau auf eine beliebige Anzahl von Dezimalstellen abgebildet wird: alle Ganzzahlen bis zu Es können 9 Dezimalstellen gespeichert werden, aber es können auch viele 10-stellige Zahlen gespeichert werden.

Warum haben Doubles keine 14 signifikanten Stellen?

Die Codierung eines Doubles verwendet 64 Bits (1 Bit für das Vorzeichen, 11 Bits für den Exponenten, 52 explizit signifikante Bits und ein implizites Bit). doppelt die Anzahl der Bits, die verwendet werden, um eine Gleitkommazahl (32 Bits) darzustellen.

Benutzeravatar von abe312
abe312

  • float: 23 Bit Signifikant, 8 Bit Exponent und 1 Vorzeichenbit.
  • double: 52 Bit Signifikant, 11 Bit Exponent und 1 Vorzeichenbit.

Benutzeravatar von user470379
Benutzer470379

Es basiert normalerweise auf signifikanten Zahlen sowohl des Exponenten als auch des Signifikanten in Basis 2, nicht in Basis 10. Soweit ich im C99-Standard feststellen kann, gibt es jedoch keine spezifizierte Genauigkeit für Floats und Doubles (außer der Tatsache, dass 1 und 1 + 1E-5 / 1 + 1E-7 sind unterscheidbar [float and double repsectively]). Die Anzahl der signifikanten Ziffern bleibt jedoch dem Implementierer überlassen (ebenso wie welche Basis er intern verwendet, mit anderen Worten, eine Implementierung könnte entscheiden, sie auf der Basis von 18 Stellen Genauigkeit in Basis 3 zu erstellen). [1]

Wenn Sie diese Werte kennen müssen, die Konstanten FLT_RADIX und FLT_MANT_DIG (und DBL_MANT_DIG / LDBL_MANT_DIG) sind in float.h definiert.

Der Grund heißt es a double liegt daran, dass die Anzahl der zum Speichern verwendeten Bytes doppelt so groß ist wie die Anzahl eines Floats (dies schließt jedoch sowohl den Exponenten als auch den Signifikanten ein). Der IEEE 754-Standard (der von den meisten Compilern verwendet wird) weist relativ mehr Bits für die Mantisse als für den Exponenten zu (23 bis 9 für float vs. 52 bis 12 für double), weshalb die Genauigkeit mehr als verdoppelt wird.

1: Abschnitt 5.2.4.2.2 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )

Ein Float hat eine Genauigkeit von 23 Bits und ein Double 52.

  • Detail: binär64 hat eine 53-Bit-Signifikanz (52 explizit gespeichert) binär32 hat 24 Bit (23 explizit gespeichert).

    – chux – Wiedereinsetzung von Monica

    18. Februar 2015 um 22:16 Uhr

Benutzeravatar von user541686
Benutzer541686

Es ist nicht genau doppelt Präzision wegen wie IEEE754 funktioniert, und weil Binär nicht wirklich gut in Dezimal übersetzt werden kann. Schauen Sie sich bei Interesse die Norm an.

  • Detail: binär64 hat eine 53-Bit-Signifikanz (52 explizit gespeichert) binär32 hat 24 Bit (23 explizit gespeichert).

    – chux – Wiedereinsetzung von Monica

    18. Februar 2015 um 22:16 Uhr

1424450cookie-check‘float’ vs. ‘double’ präzision

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy