Bagaimana cara mencetak double
nilai dengan presisi penuh menggunakan cout?
Gunakan hexfloat
atau
gunakan scientific
dan 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 double
tentu 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:
fixed
atau scientific
?
A double
adalah tipe titik mengambang , bukan titik tetap .
Jangan tidak menggunakan std::fixed
sebagai yang gagal untuk mencetak kecil double
sebagai 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::scientific
yang 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 double
dikodekan 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 N
angka 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 double
dan teks desimal. Jika fix N
dipilih, kadang-kadang akan sedikit lebih atau kurang dari yang dibutuhkan untuk double
nilai - nilai tertentu . Kami dapat kesalahan pada terlalu sedikit (di a)
bawah) atau terlalu banyak (di b)
bawah).
3 kandidat N
:
a) Gunakan N
jadi 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 N
jadi ketika mengkonversi dari double
-text- double
kita tiba di sama double
untuk semua double
.
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
Ketika max_digits10
tidak tersedia, perhatikan bahwa karena atribut basis 2 dan basis 10 digits10 + 2 <= max_digits10 <= digits10 + 3
,, kita dapat menggunakan digits10 + 3
untuk memastikan angka desimal yang cukup dicetak.
c) Gunakan an N
yang bervariasi dengan nilainya.
Ini bisa bermanfaat ketika kode ingin menampilkan teks minimal ( N == 1
) atau nilai tepat a double
( N == 1000-ish
untuk kasus denorm_min
). Namun karena ini "bekerja" dan bukan tujuan OP, itu akan dikesampingkan.
Biasanya b) yang digunakan untuk "mencetak double
nilai 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_digits10
angka 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;
,fixed
beri saya0.000000000000000
danscientific
output6.626069570000000e-34
.