Bagaimana cara mencetak doublenilai dengan presisi penuh menggunakan cout?
Gunakan hexfloatatau
gunakan scientificdan atur presisi
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
Terlalu banyak jawaban hanya membahas satu dari 1) basis 2) tata letak tetap / ilmiah atau 3) presisi. Terlalu banyak jawaban dengan presisi tidak memberikan nilai tepat yang dibutuhkan. Karena itu, ini menjawab pertanyaan lama.
- Basis apa?
A doubletentu dikodekan menggunakan basis 2. Pendekatan langsung dengan C ++ 11 adalah mencetak menggunakan std::hexfloat.
Jika output non-desimal dapat diterima, kita selesai.
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
- Jika tidak:
fixedatau scientific?
A doubleadalah tipe titik mengambang , bukan titik tetap .
Jangan tidak menggunakan std::fixedsebagai yang gagal untuk mencetak kecil doublesebagai sesuatu tetapi 0.000...000. Secara umum double, ia mencetak banyak digit, mungkin ratusan informasi yang dipertanyakan.
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
Untuk mencetak dengan presisi penuh, gunakan pertama std::scientificyang akan "menulis nilai floating-point dalam notasi ilmiah". Perhatikan default 6 digit setelah titik desimal, jumlah yang tidak mencukupi, ditangani di titik berikutnya.
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
- Berapa presisi (berapa total digit)?
A doubledikodekan menggunakan basis biner 2 mengkodekan presisi yang sama antara berbagai kekuatan 2. Ini sering 53 bit.
[1.0 ... 2.0) ada 2 53 berbeda double,
[2.0 ... 4.0) ada 2 53 berbeda double,
[4.0 ... 8.0) ada 2 53 berbeda double,
[8.0 ... 10.0) ada 2 / 8 * 2 53 berbeda double.
Namun jika kode cetakan dalam desimal dengan Nangka yang signifikan, jumlah kombinasi [1.0 ... 10.0) adalah 9/10 * 10 N .
Apa pun N(presisi) yang dipilih, tidak akan ada pemetaan satu-ke-satu antara doubledan teks desimal. Jika fix Ndipilih, kadang-kadang akan sedikit lebih atau kurang dari yang dibutuhkan untuk doublenilai - nilai tertentu . Kami dapat kesalahan pada terlalu sedikit (di a)bawah) atau terlalu banyak (di b)bawah).
3 kandidat N:
a) Gunakan Njadi ketika mengkonversi dari teks- double-teks kita tiba di teks yang sama untuk semua double.
std::cout << dbl::digits10 << '\n';
// Typical output
15
b) Gunakan Njadi ketika mengkonversi dari double-text- doublekita tiba di sama doubleuntuk semua double.
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
Ketika max_digits10tidak tersedia, perhatikan bahwa karena atribut basis 2 dan basis 10 digits10 + 2 <= max_digits10 <= digits10 + 3,, kita dapat menggunakan digits10 + 3untuk memastikan angka desimal yang cukup dicetak.
c) Gunakan an Nyang bervariasi dengan nilainya.
Ini bisa bermanfaat ketika kode ingin menampilkan teks minimal ( N == 1) atau nilai tepat a double( N == 1000-ishuntuk kasus denorm_min). Namun karena ini "bekerja" dan bukan tujuan OP, itu akan dikesampingkan.
Biasanya b) yang digunakan untuk "mencetak doublenilai dengan presisi penuh". Beberapa aplikasi mungkin lebih suka a) salah karena tidak memberikan terlalu banyak informasi.
Dengan .scientific, .precision()atur jumlah digit untuk dicetak setelah titik desimal, sehingga 1 + .precision()digit dicetak. Kode membutuhkan max_digits10angka total sehingga .precision()disebut dengan a 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
Pertanyaan C serupa
fixed? Dengandouble h = 6.62606957e-34;,fixedberi saya0.000000000000000danscientificoutput6.626069570000000e-34.