Wie drucke ich einen doubleWert mit cout mit voller Präzision?
Verwenden hexfloatoder
verwenden scientificund 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 doublewird 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:
fixedoder scientific?
A doubleist ein Gleitkommatyp , kein Festkomma .
Verwenden Sie nicht , std::fixedda dies nicht so klein doublewie alles andere als drucken kann 0.000...000. Im Großen doubleund 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 doubleunter 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 Nsignifikanten Stellen, die Anzahl der Kombinationen [1.0 ... 10.0) ist 9/10 * 10 N .
Unabhängig von der Ngewählten (Genauigkeit) erfolgt keine Eins-zu-Eins-Zuordnung zwischen doubleund Dezimaltext. Wenn ein Fix Nausgewählt wird, ist er manchmal für bestimmte doubleWerte 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 Nso, wenn Sie aus doubleText-Text konvertieren, erhalten wir für alle den gleichen Text double.
std::cout << dbl::digits10 << '\n';
// Typical output
15
b) Verwenden Sie ein Nso, wenn Sie von double-text- konvertieren, doublewir kommen doublefür alle gleich double.
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
Wenn max_digits10nicht verfügbar, beachten Sie, dass digits10 + 2 <= max_digits10 <= digits10 + 3wir 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-ishim 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 doubleWert 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_digits10insgesamt 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;,fixedgibt mir0.000000000000000undscientificgibt aus6.626069570000000e-34.