tabelle - unsigned char c



'float' vs. 'doppelte' Präzision (4)

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);

gibt Ihnen die Ausgabe

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

wo auf der dritten Zeile der Ausgabe 741012573242 Müll ist und auf der vierten Zeile 116 Müll ist. Haben Doubles immer 16 signifikante Zahlen, während Floats immer 7 signifikante Zahlen haben? Warum haben Doppel nicht 14 signifikante Zahlen?

https://code.i-harness.com


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

Nein. Doubles haben immer 53 signifikante Bits und Floats haben immer 24 signifikante Bits (außer Denormalen, Unendlichkeiten und NaN-Werten, aber das sind Themen für eine andere Frage). Dies sind binäre Formate, und Sie können nur deutlich über die Genauigkeit ihrer Darstellungen in Bezug auf Binärziffern (Bits) sprechen.

Dies entspricht der Frage, wie viele Ziffern in einer binären Ganzzahl gespeichert werden können: Eine vorzeichenlose 32-Bit-Ganzzahl kann ganze Zahlen mit bis zu 32 Bits speichern, die nicht genau einer beliebigen Anzahl von Dezimalziffern zugeordnet werden können: alle Ganzzahlen von bis zu Es können 9 Dezimalziffern gespeichert werden, aber auch viele 10-stellige Zahlen können gespeichert werden.

Warum haben Doppel nicht 14 signifikante Zahlen?

Die Kodierung eines Doppels verwendet 64 Bits (1 Bit für das Vorzeichen, 11 Bits für den Exponenten, 52 explizite signifikante Bits und ein implizites Bit), was die doppelte Anzahl von Bits ist, die zum Darstellen eines Gleitkommawerts (32 Bits) verwendet werden.


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


Es ist nicht genau doppelte Genauigkeit, weil IEEE 754 funktioniert, und weil Binär nicht wirklich gut in Dezimal übersetzt. Sehen Sie sich den Standard an, wenn Sie interessiert sind.


Fließkommazahlen in C verwenden die IEEE 754- Codierung.

Diese Art der Codierung verwendet ein Vorzeichen, einen Signifikanden und einen Exponenten.

Aufgrund dieser Codierung haben viele Nummern kleine Änderungen, damit sie gespeichert werden können.

Außerdem kann sich die Anzahl der signifikanten Stellen geringfügig ändern, da es sich um eine binäre Darstellung und nicht um eine Dezimalzahl handelt.

Einzelpräzision (Float) gibt Ihnen 23 Bits von Signifikanz, 8 Bits von Exponenten und 1 Vorzeichenbit.

Doppelte Genauigkeit (doppelt) gibt Ihnen 52 Bits von Signifikanz, 11 Bits von Exponenten und 1 Vorzeichenbit.





floating-point