Tidak semua angka berhenti pada koma nol: berat paket 1,85 kg, suhu 36,7 derajat, atau rata-rata nilai 87,25 butuh representasi pecahan. C++ menyediakannya lewat keluarga floating-point — tipe yang menyimpan angka dalam format ilmiah biner, terdiri atas signifikannya dan eksponen, persis seperti penulisan 6,022 × 10²³ di buku fisika. Chapter ini memperkenalkan tiga tipe floating-point beserta tingkat presisinya, aturan penulisan literal dengan suffix dan notasi eksponensial, lalu mengupas perilaku std::cout yang hanya menampilkan enam digit signifikan secara default — pengaturan yang sering membuat pemula bingung ketika angka panjang tiba-tiba terpotong.
Tiga Tipe Floating-Point #
| Tipe | Presisi khas | Ukuran di platform ini |
|---|---|---|
float | sekitar 7 digit desimal | 4 byte |
double | sekitar 15-17 digit desimal | 8 byte |
long double | lebih luas lagi (80-bit extended di x86) | 16 byte |
double adalah pilihan default yang disarankan untuk hampir semua keperluan: presisinya jauh lebih lega, kecepatannya setara float di CPU modern, dan pustaka matematika <cmath> seluruhnya beroperasi di atas double. float tetap berguna ketika jutaan nilai harus disimpan sekaligus — misalnya data grafis atau pembelajaran mesin — dan penghematan setengah memori lebih berharga daripada digit tambahan. long double jarang dipakai di kode aplikasi; ia muncul terutama di perhitungan numerik khusus. Ukuran persis tiap tipe di platform ini bisa Anda verifikasi sendiri dengan sizeof pada Chapter sizeof dan limits.
Menulis Literal Floating-Point #
Literal floating-point ditulis dengan titik desimal gaya Inggris (3.14, bukan 3,14), bisa disertai suffix tipe (f untuk float, L untuk long double; tanpa suffix berarti double), dan mendukung notasi eksponensial e: 1.5e3 berarti 1,5 × 10³ yaitu 1500, sedangkan 2.5e-2 berarti 2,5 × 10⁻² yaitu 0,025. Satu kebiasaan yang perlu dibentuk sejak sekarang: selalu pasang f saat mengisi float. Tanpa suffix, literal seperti 3.14159265358979 bertipe double, sehingga nilainya harus dikonversi sekali lagi ke float saat disimpan — langkah kecil yang menambah kehilangan presisi tanpa kita sadari.
Presisi Default cout dan Wajah Asli Biner #
Program berikut menyimpan nilai π yang panjang di ketiga tipe, lalu mencetaknya dengan presisi bawaan dan presisi yang dinaikkan lewat std::setprecision — manipulator dari header <iomanip>, pustaka kecil berisi utilitas pemformatan stream:
#include <iomanip>
#include <iostream>
int main() {
double phi = 3.14159265358979; // double: pilihan utama
float phiFloat = 3.14159265358979f; // float: wajib suffix f
long double phiLong = 3.14159265358979L;
std::cout << "double : " << phi << "\n";
std::cout << "float : " << phiFloat << "\n";
std::cout << "long double : " << phiLong << "\n";
// Naikkan presisi ke 9 digit signifikan: bedanya jadi terlihat
std::cout << std::setprecision(9);
std::cout << "float @9 : " << phiFloat << "\n";
std::cout << "double @9 : " << phi << "\n";
// Presisi default (6 digit signifikan) menyembunyikan detail biner
std::cout << std::setprecision(6);
std::cout << "0.1 + 0.2 : " << 0.1 + 0.2 << "\n";
// Presisi 17 digit: wajah asli aritmetika biner
std::cout << std::setprecision(17);
std::cout << "0.1 + 0.2 @17: " << 0.1 + 0.2 << "\n";
// Literal eksponensial, kembali ke presisi default
std::cout << std::setprecision(6);
std::cout << "1.5e3 : " << 1.5e3 << "\n";
std::cout << "2.5e-2 : " << 2.5e-2 << "\n";
return 0;
}Output yang Dihasilkan:
double : 3.14159
float : 3.14159
long double : 3.14159
float @9 : 3.14159274
double @9 : 3.14159265
0.1 + 0.2 : 0.3
0.1 + 0.2 @17: 0.30000000000000004
1.5e3 : 1500
2.5e-2 : 0.025Hasil ini menyimpan tiga pelajaran besar:
- Empat baris pertama terlihat identik karena presisi default
std::coutadalah 6 digit signifikan:3.14159saja yang tercetak, sisanya dibulatkan. Nilai yang tersimpan di memori tetap berbeda panjangnya antar tipe — hanya tampilannya yang disamakan. - Pada presisi 9 digit, perbedaan tipe muncul:
floatmenyerah di3.14159274(digit ke-8 sudah melenceng), sedangkandoublemasih tepat di3.14159265. Inilah makna tabel presisi di awal chapter. 0.1 + 0.2 @17mencetak0.30000000000000004— bukan bug compiler, melainkan sifat format biner: pecahan 0,1 dan 0,2 tidak bisa direpresentasikan persis dalam biner (seperti 1/3 tidak bisa ditulis persis dalam desimal), sehingga penjumlahannya menyisakan selisih kecil. Presisi default menyembunyikannya di balik0.3, tetapi perhitungan keuangan atau pembandingan kesetaraan yang ceroboh bisa terpapar.
Dengan bilangan bulat dan pecahan selesai, dua tipe fundamental tersisa yang bentuknya berbeda dari angka: char yang menyimpan karakter, dan bool yang hanya mengenal benar-salah. Keduanya ternyata kerabat dekat integer — buktinya menyusul di Chapter berikutnya.
Rujukan resmi untuk topik Chapter ini: floating-point literal dan fundamental types di cppreference.