Cara kerja penyimpanan angka desimal
Mari kita bedah cara kerja penyimpanan angka desimal (seperti float
atau double
) di memori komputer. Ini memang sedikit rumit pada awalnya, tetapi dengan contoh, konsepnya akan menjadi jauh lebih jelas.
Standar yang paling umum digunakan untuk ini adalah IEEE 754. Bayangkan ini seperti "aturan main" universal agar semua komputer mengerti cara membaca dan menulis angka desimal dengan cara yang sama.
Konsep utamanya adalah menyimpan angka dalam bentuk notasi ilmiah biner, mirip seperti notasi ilmiah desimal yang mungkin Anda kenal (contoh: 6.022 x 10²³).
Setiap angka float
(32-bit) atau double
(64-bit) dipecah menjadi tiga bagian utama:
Sign (Tanda): Bagian paling sederhana. Menentukan apakah angka itu positif atau negatif.
Exponent (Pangkat): Menentukan seberapa besar atau kecil angka tersebut (pangkat dari 2).
Fraction / Mantissa (Pecahan): Merepresentasikan digit-digit presisi dari angka tersebut.
Anatomi float
(Single Precision - 32 bit)
float
(Single Precision - 32 bit)Kita akan fokus pada float
karena lebih mudah dihitung. Sebuah float
memiliki 32 bit yang dialokasikan sebagai berikut:
[S] [EEEEEEEE] [FFFFFFFFFFFFFFFFFFFFFFF]
Sign (S): 1 bit.
0
= Positif (+)1
= Negatif (-)
Exponent (E): 8 bit.
Bagian ini tidak menyimpan nilai pangkat secara langsung. Ia menyimpan nilai pangkat yang sudah ditambah bias (biasa). Untuk
float
, nilai biasnya adalah 127.Jadi, rumusnya:
Exponent yang Disimpan = Exponent Sebenarnya + 127
. Tujuannya agar bisa merepresentasikan pangkat positif dan negatif tanpa memerlukan bit tanda tambahan untuk exponent.
Fraction (F) / Mantissa: 23 bit.
Ini adalah bagian desimal dari notasi ilmiah biner (angka di belakang
1,
...). Ada "bit tersembunyi" (hidden bit
) yaitu angka1
di depan koma yang tidak perlu disimpan untuk efisiensi.
🧑💻 Studi Kasus: Menyimpan Angka -13.625 dalam Memori
Mari kita ubah angka desimal -13.625 menjadi representasi float
32-bit langkah demi langkah.
Langkah 1: Tentukan Bit Tanda (Sign)
Angka kita adalah -13.625, berarti negatif.
Sign (S) = 1
Langkah 2: Konversi Angka ke Biner
Kita perlu mengubah bagian bulat (13) dan bagian pecahan (0.625) secara terpisah.
Bagian Bulat (13):
13 / 2 = 6 sisa 1
6 / 2 = 3 sisa 0
3 / 2 = 1 sisa 1
1 / 2 = 0 sisa 1
Baca dari bawah ke atas:
1101
Bagian Pecahan (0.625):
0.625 x 2 = 1.25 (ambil
1
)0.25 x 2 = 0.5 (ambil
0
)0.5 x 2 = 1.0 (ambil
1
)Baca dari atas ke bawah:
101
Jadi, 13.625
dalam biner adalah 1101.101
.
Langkah 3: Normalisasi Biner
Sekarang, kita ubah biner tadi ke dalam bentuk notasi ilmiah (bentuk 1.xxxxx * 2^pangkat
). Kita geser titik desimalnya sampai hanya ada satu angka 1
di depan.
1101.101
Geser titik ke kiri sebanyak 3 kali:
1.101101
Karena kita geser ke kiri 3 kali, pangkatnya menjadi 3.
Hasil normalisasi:
1.101101 * 2³
Dari sini kita mendapatkan dua informasi penting:
Exponent Sebenarnya = 3
Fraction/Mantissa = 101101 (semua digit setelah
1.
)
Langkah 4: Hitung Exponent yang Disimpan
Kita gunakan rumus Exponent Sebenarnya + Bias
.
3 + 127 = 130
Sekarang, konversi
130
ke biner 8-bit:10000010
Exponent (E) = 10000010
Langkah 5: Tentukan Fraction yang Disimpan
Fraction
adalah 23 bit. Kita sudah punya 101101
dari langkah 3. Kita tinggal tambahkan angka 0 di belakangnya sampai total menjadi 23 digit.
Fraction (F) = 10110100000000000000000
Langkah 6: Gabungkan Semuanya!
Sekarang kita satukan ketiga bagian tersebut sesuai urutan: S-E-F.
Sign (S):
1
Exponent (E):
10000010
Fraction (F):
10110100000000000000000
Maka, representasi 32-bit dari -13.625 di memori adalah:
1 10000010 10110100000000000000000
Jika dikelompokkan per 4 bit (untuk diubah ke heksadesimal), menjadi:
1100 0001 0101 1010 0000 0000 0000 0000
C 1 5 A 0 0 0 0
Jadi, dalam heksadesimal, -13.625 direpresentasikan sebagai 0xC15A0000.
Bagaimana Cara Komputer Membacanya Kembali?
Komputer melakukan proses sebaliknya:
Lihat bit pertama:
1
-> Oh, ini angka negatif.Lihat 8 bit berikutnya:
10000010
-> Ini adalah130
dalam desimal. Karena ada bias 127, maka130 - 127 = 3
. Pangkatnya adalah2³
.Lihat 23 bit terakhir:
101101...
-> Ini adalah pecahannya. Komputer menambahkan "bit tersembunyi"1.
di depannya, menjadi1.101101
.Gabungkan:
(-1) * 1.101101 * 2³
Geser titik desimal ke kanan 3 kali:
(-1) * 1101.101
Ubah ke desimal:
1101
adalah 13, dan0.101
adalah 0.625.Hasil akhir: -13.625. Cocok!
Bagaimana dengan double
(Double Precision - 64 bit)?
double
(Double Precision - 64 bit)?Prinsipnya sama persis, hanya alokasi bitnya yang berbeda dan lebih besar, sehingga presisinya jauh lebih tinggi.
Sign: 1 bit
Exponent: 11 bit (dengan bias 1023)
Fraction: 52 bit
Mari kita lanjutkan dengan beberapa studi kasus lagi agar semakin terbiasa.
Studi Kasus 2: Angka Desimal Kecil (9.2)
Mari kita representasikan 9.2 sebagai float
32-bit.
1. Tanda (Sign)
Angka 9.2 adalah positif.
Sign (S) = 0
2. Konversi ke Biner
Bagian Bulat (9):
1001
Bagian Pecahan (0.2):
0.2 x 2 = 0.4
0.4 x 2 = 0.8
0.8 x 2 = 1.6
0.6 x 2 = 1.2
0.2 x 2 = 0.4 (Mulai berulang: 0110...)
Hasilnya adalah biner berulang:
0.001100110...
Jadi, 9.2
dalam biner adalah 1001.001100110...
3. Normalisasi Biner
Kita geser titik desimal ke kiri sebanyak 3 kali.
1.001001100110... * 2³
Dari sini kita dapatkan:
Exponent Sebenarnya = 3
Fraction = 001001100110...
4. Hitung Exponent
Exponent Sebenarnya + Bias
=3 + 127 = 130
130
dalam biner 8-bit adalah10000010
.Exponent (E) = 10000010
5. Tentukan Fraction
Kita ambil 23 bit dari hasil normalisasi 00100110011001100110011...
Fraction (F) = 00100110011001100110011
6. Gabungkan
S:
0
E:
10000010
F:
00100110011001100110011
0 10000010 00100110011001100110011
Perhatikan bahwa karena 0.2
tidak dapat direpresentasikan secara sempurna dalam biner, hasil ini adalah sebuah aproksimasi (pembulatan). Inilah alasan mengapa operasi dengan float
terkadang bisa menghasilkan galat presisi kecil.
Studi Kasus 3: Angka Bulat Sederhana (10.0)
Mari kita representasikan 10.0 sebagai float
32-bit.
1. Tanda (Sign)
Angka 10.0 adalah positif.
Sign (S) = 0
2. Konversi ke Biner
Bagian Bulat (10):
1010
Bagian Pecahan (0.0):
0
Hasilnya adalah
1010.0
3. Normalisasi Biner
Kita geser titik desimal ke kiri sebanyak 3 kali.
1.010 * 2³
Dari sini kita dapatkan:
Exponent Sebenarnya = 3
Fraction = 010`
4. Hitung Exponent
Exponent Sebenarnya + Bias
=3 + 127 = 130
130
dalam biner 8-bit adalah10000010
.Exponent (E) = 10000010
5. Tentukan Fraction
Kita ambil 010
dan tambahkan nol di belakangnya hingga 23 bit.
Fraction (F) = 01000000000000000000000
6. Gabungkan
S:
0
E:
10000010
F:
01000000000000000000000
0 10000010 01000000000000000000000
➕ Studi Kasus Perhitungan: Pertambahan (0.5 + 0.75)
Komputer tidak bisa langsung menjumlahkan dua representasi float
. Ada beberapa langkah yang harus dilakukan.
Hasil yang kita harapkan: 0.5 + 0.75 = 1.25
1. Konversi Kedua Angka ke Format Float
Untuk 0.5:
Biner:
0.1
Normalisasi:
1.0 * 2⁻¹
Sign:
0
Exponent:
-1 + 127 = 126
(biner01111110
)Fraction:
000...
Float A (0.5):
0 01111110 00000000000000000000000
Untuk 0.75:
Biner:
0.11
Normalisasi:
1.1 * 2⁻¹
Sign:
0
Exponent:
-1 + 127 = 126
(biner01111110
)Fraction:
100...
Float B (0.75):
0 01111110 10000000000000000000000
2. Samakan Exponent
Sebelum dijumlahkan, pangkat (exponent) kedua angka harus sama. Dalam kasus ini, exponentnya sudah sama (126), jadi kita tidak perlu melakukan apa-apa.
Jika berbeda, angka dengan exponent lebih kecil akan "digeser" (denormalisasi) hingga exponentnya sama dengan yang lebih besar.
3. Tambahkan Mantissa
Sekarang kita tambahkan mantissanya. Ingat, ada "bit tersembunyi" 1.
di depan.
Mantissa A (0.5):
1.000...
Mantissa B (0.75):
1.100...
Penjumlahan:
1.000 1.100 + ----- 10.100
Hasilnya adalah
10.1
(dengan exponent2⁻¹
yang sama).
4. Normalisasi Hasil
Hasil penjumlahan 10.1 * 2⁻¹
belum ternormalisasi (karena ada dua digit di depan koma). Kita normalkan lagi.
Geser titik ke kiri 1 kali:
1.01 * 2⁰
Sekarang kita punya hasil akhir yang sudah ternormalisasi.
5. Ubah Hasil ke Format Float
Sign: Positif, jadi
0
Exponent Sebenarnya:
0
. Maka Exponent tersimpan:0 + 127 = 127
(biner01111111
)Fraction:
01
(diikuti 21 angka nol)
Hasil akhir 1.25 dalam format float:
0 01111111 01000000000000000000000
Proses ini menunjukkan mengapa operasi floating-point
lebih "mahal" (membutuhkan lebih banyak siklus komputasi) dibandingkan operasi integer, karena ada langkah-langkah tambahan seperti penyamaan exponent dan normalisasi ulang.
Last updated