Wie drucke ich einen double
Wert mit cout mit voller Präzision?
Verwenden hexfloat
oder
verwenden scientific
und stellen Sie die Präzision ein
std::cout.precision(std::numeric_limits<double>::max_digits10 - 1);
std::cout << std::scientific << 1.0/7.0 << '\n';
// C++11 Typical output
1.4285714285714285e-01
Zu viele Antworten sprechen nur eine von 1) Basis 2) festem / wissenschaftlichem Layout oder 3) Präzision an. Zu viele präzise Antworten liefern nicht den richtigen Wert. Daher diese Antwort auf eine alte Frage.
- Welche Basis?
A double
wird sicherlich mit Basis 2 codiert. Ein direkter Ansatz mit C ++ 11 besteht darin, mit zu drucken std::hexfloat
.
Wenn eine nicht dezimale Ausgabe akzeptabel ist, sind wir fertig.
std::cout << "hexfloat: " << std::hexfloat << exp (-100) << '\n';
std::cout << "hexfloat: " << std::hexfloat << exp (+100) << '\n';
// output
hexfloat: 0x1.a8c1f14e2af5dp-145
hexfloat: 0x1.3494a9b171bf5p+144
- Sonst:
fixed
oder scientific
?
A double
ist ein Gleitkommatyp , kein Festkomma .
Verwenden Sie nicht , std::fixed
da dies nicht so klein double
wie alles andere als drucken kann 0.000...000
. Im Großen double
und Ganzen werden viele Ziffern gedruckt, möglicherweise Hunderte fragwürdiger Informationen.
std::cout << "std::fixed: " << std::fixed << exp (-100) << '\n';
std::cout << "std::fixed: " << std::fixed << exp (+100) << '\n';
// output
std::fixed: 0.000000
std::fixed: 26881171418161356094253400435962903554686976.000000
Um mit voller Präzision zu drucken, verwenden Sie zuerst std::scientific
"Gleitkommawerte in wissenschaftlicher Notation schreiben". Beachten Sie, dass der Standardwert von 6 Stellen, nachdem der Dezimalpunkt, ein unzureichender Betrag, im nächsten Punkt behandelt wird.
std::cout << "std::scientific: " << std::scientific << exp (-100) << '\n';
std::cout << "std::scientific: " << std::scientific << exp (+100) << '\n';
// output
std::scientific: 3.720076e-44
std::scientific: 2.688117e+43
- Wie genau (wie viele Ziffern insgesamt)?
Eine double
unter Verwendung der Binärbasis 2 codierte Codierung codiert die gleiche Genauigkeit zwischen verschiedenen Potenzen von 2. Dies sind häufig 53 Bit.
[1.0 ... 2.0) es gibt 2 53 verschiedene double
,
[2.0 ... 4.0) es gibt 2 53 verschiedene double
,
[4.0 ... 8.0) es gibt 2 53 verschiedene double
,
[8.0 ... 10.0) es gibt 2 / 8 * 2 53 verschiedene double
.
Doch wenn Code druckt in dezimal mit N
signifikanten Stellen, die Anzahl der Kombinationen [1.0 ... 10.0) ist 9/10 * 10 N .
Unabhängig von der N
gewählten (Genauigkeit) erfolgt keine Eins-zu-Eins-Zuordnung zwischen double
und Dezimaltext. Wenn ein Fix N
ausgewählt wird, ist er manchmal für bestimmte double
Werte etwas mehr oder weniger als wirklich erforderlich . Wir könnten bei zu wenigen ( a)
unten) oder zu vielen ( b)
unten) Fehler machen .
3 Kandidat N
:
a) Verwenden Sie ein N
so, wenn Sie aus double
Text-Text konvertieren, erhalten wir für alle den gleichen Text double
.
std::cout << dbl::digits10 << '\n';
// Typical output
15
b) Verwenden Sie ein N
so, wenn Sie von double
-text- konvertieren, double
wir kommen double
für alle gleich double
.
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
Wenn max_digits10
nicht verfügbar, beachten Sie, dass digits10 + 2 <= max_digits10 <= digits10 + 3
wir aufgrund der Attribute Basis 2 und Basis 10 verwenden könnendigits10 + 3
, dass genügend Dezimalstellen gedruckt werden.
c) Verwenden Sie eine N
, die mit dem Wert variiert.
Dies kann nützlich sein, wenn Code minimalen Text ( N == 1
) oder den genauen Wert von a double
( N == 1000-ish
im Fall von denorm_min
) anzeigen möchte . Da dies jedoch "Arbeit" ist und wahrscheinlich nicht das Ziel von OP ist, wird es beiseite gelegt.
Es wird normalerweise b) verwendet, um "einen double
Wert mit voller Genauigkeit zu drucken ". Einige Anwendungen ziehen es möglicherweise vor, a) Fehler zu machen, wenn nicht zu viele Informationen bereitgestellt werden.
Legt mit fest .scientific
, wie .precision()
viele Stellen nach dem Dezimalpunkt 1 + .precision()
gedruckt werden sollen , damit die Stellen gedruckt werden. Code benötigt max_digits10
insgesamt Ziffern und wird daher .precision()
mit a aufgerufen max_digits10 - 1
.
typedef std::numeric_limits< double > dbl;
std::cout.precision(dbl::max_digits10 - 1);
std::cout << std::scientific << exp (-100) << '\n';
std::cout << std::scientific << exp (+100) << '\n';
// Typical output
3.7200759760208361e-44
2.6881171418161356e+43
//1234567890123456 17 total digits
Ähnliche C-Frage
fixed
? Mitdouble h = 6.62606957e-34;
,fixed
gibt mir0.000000000000000
undscientific
gibt aus6.626069570000000e-34
.