Mengapa 0,1 + 0,2 bukan 0,3 di komputer: karena bilangan desimal disimpan dalam biner, dan 1/10 tidak memiliki penulisan biner yang berhingga. Komputer menyimpan perkiraan 0,1 dan perkiraan 0,2, lalu jumlahnya tampil sebagai 0,30000000000000004. Jumlah matematika eksaknya adalah 1/10 + 2/10 = 3/10, seperti yang ditegaskan alat desimal ke pecahan.
Pokoknya
- Pada basis 10, 1/3 tidak berhenti karena penyebutnya memuat faktor prima 3; pada basis 2, 1/10 tidak berhenti karena penyebutnya memuat faktor prima 5.
- Suatu desimal berhenti pada sebuah basis hanya jika, setelah disederhanakan, penyebutnya membagi sebuah pangkat dari basis itu: pada basis 10, faktor 2 dan 5; pada basis 2, hanya faktor 2.
- Pada format IEEE 754 presisi ganda (binary64), angka 0,1 disimpan tepat sebagai pecahan 3602879701896397/36028797018963968, yaitu pecahan atas 2⁵⁵.
- Menulis 0,1 + 0,2 di JavaScript atau Python menampilkan 0,30000000000000004, bukan 0,3.
- Bilangan rasional eksak, seperti 1/10 + 2/10 = 3/10, mempertahankan nilainya; desimal mesin adalah perkiraan.
- Pecahan seperti 1/2, 3/8 dan 5/16 memiliki penulisan biner eksak, karena penyebutnya hanya memuat faktor 2.
Aturan yang sama pada basis 10 dan basis 2
Hasil yang aneh itu bukan kerusakan komputer: itu akibat menulis bilangan rasional pada basis yang tidak menguntungkannya. Aturannya sama dengan yang dipakai untuk desimal pada basis 10, diterapkan pada basis 2.
Pada basis 10, pecahan tersederhana memberi desimal eksak jika penyebutnya hanya memiliki faktor prima 2 dan 5. Jika muncul faktor prima lain, desimalnya berulang. Itulah sebabnya 1/3 = 0,333… tidak pernah berhenti: penyebut 3 tidak dapat menjadi bagian dari pangkat sepuluh. Kriteria ini dijelaskan rinci pada panduan pecahan desimal berhingga.
Pada basis 2 hal yang sama terjadi, tetapi basisnya adalah angka 2, bukan 10. Suatu desimal berhenti jika penyebut tersederhananya adalah pangkat 2. Penyebut 10 = 2 × 5 memuat faktor prima 5, yang tidak masuk ke pangkat dua mana pun. Itulah sebabnya 1/10 = 0,0001100110011…₂ berulang tanpa akhir. Blok yang berulang adalah 0011, dan panjang periodenya 4. Perbedaan antara desimal berhingga dan berulang, dengan contoh lain, dipaparkan di desimal berhingga dan berulang.
1/3 = 0,333… (basis 10); 1/10 = 0,000110011…₂ (basis 2)
Simetrinya tepat. Pada basis 10, penyebut 3 menahan desimal agar tidak berhenti; pada basis 2, penyebut 5 menahan penulisannya agar tidak berhenti. Faktor prima yang tersisa terhadap basis itulah penyebabnya, dan penyebutlah yang menentukan.
Peran faktor prima
Pecahan tersederhana memiliki penulisan berhingga pada basis b tepat ketika penyebutnya membagi suatu pangkat b. Membagi pangkat b hanya bisa memakai faktor prima b. Pada basis 10, faktor prima 10 adalah 2 dan 5; pada basis 2, satu-satunya faktor prima adalah 2.
Hal ini dapat diperiksa dengan perkalian. Desimal berhingga dengan n angka pada basis 2 bernilai bilangan bulat dibagi 2ⁿ. Misalnya, 0,101₂ = 101₂/2³ = 5/8, dan 5/8 hanya butuh faktor 2. Jika penyebut tersederhana adalah pangkat 2, mengalikan pembilang dan penyebut dengan pangkat yang kurang akan menghasilkan pangkat 2. Jika tersisa faktor prima lain, seperti 5 pada 1/10, tidak ada pangkat 2 yang memuatnya.
Kriteria ini bergantung pada penyebut pecahan paling sederhana, bukan pada pembilang atau penulisan awalnya. Untuk mengubah desimal menjadi pecahan eksaknya, gunakan alat desimal ke pecahan, yang mempertahankan angka yang tertulis dan tidak menafsirkan perkiraan mesin. Pecahan seperti 1/10 adalah bilangan rasional yang sepenuhnya eksak; yang tidak eksak adalah penulisannya pada basis 2. Nilai setiap posisi desimal, persepuluhan dan perseratusan, diulas di pecahan desimal.
Bagaimana 0,1 sebenarnya disimpan
Saat menulis 0,1 di sebuah program, bahasa hampir selalu mengubahnya ke format IEEE 754 presisi ganda, yang disebut binary64. Format itu memakai 64 bit dan hanya menyediakan 53 bit presisi untuk mantisa, sehingga tidak dapat menyimpan penulisan 1/10 yang tak berhingga. Ia menyimpan nilai terdekat yang dapat diwakili.
Nilai terdekat itu tepat adalah pecahan 3602879701896397/36028797018963968. Karena 36028797018963968 = 2⁵⁵, penyebutnya adalah pangkat 2, sesuai tuntutan format. Pembilangnya ganjil dan sedikit lebih besar dari sepersepuluh penyebut, jadi angka yang disimpan berada sedikit di atas 0,1.
Selisihnya terhadap 1/10 adalah 1/180143985094819840, nilai berorde 5,6 × 10⁻¹⁸. Itu galat perkiraan yang sangat kecil, tak terlihat pada sedikit angka, tetapi nyata. Pecahan eksak 1/10 tidak disimpan; yang disimpan adalah tetangga binernya yang terbaik.
Mengapa 0,1 + 0,2 bukan 0,3?
Setiap operand diubah sebelum operasi: baik 0,1 maupun 0,2 disimpan sebagai pecahan biner yang mendekati nilai desimal tetapi tidak menyamainya. Saat kedua nilai tersimpan dijumlahkan, galat kecil menumpuk dan hasilnya menjauh dari 3/10 cukup untuk menampilkan angka terakhir yang tak terduga.
Dalam praktik, menulis 0.1 + 0.2 di JavaScript atau Python menampilkan 0.30000000000000004. Teks itu adalah desimal terpendek yang mengenali secara unik bilangan biner tersimpan; itu tidak berarti hasilnya sendiri memiliki 17 angka signifikan. Kuantitas yang benar-benar disimpan berada di satu sisi 3/10, dan program hanya menampilkannya dengan setia.
Galat hasilnya (≈ 4,4 × 10⁻¹⁷) lebih besar daripada galat tiap operand (≈ 5,6 × 10⁻¹⁸ dan ≈ 1,1 × 10⁻¹⁷), karena ada dua pembulatan sebelumnya dan satu pembulatan akhir. Tak perlu menghafal besar selisihnya: yang penting adalah memahami bahwa biner tidak dapat mewakili 1/10 maupun 2/10, dan galat jumlahnya menggabungkan keduanya.
1/10 + 2/10 = 3/10; mesin menampilkan 0,30000000000000004
Desimal mana yang eksak dalam biner?
Desimal yang penyebut tersederhananya adalah pangkat 2 bersifat eksak dalam biner. Kasus paling sederhana adalah 1/2 = 0,1₂, 3/8 = 0,011₂ dan 5/16 = 0,0101₂. Masing-masing bersesuaian dengan setengah, seperdelapan dan seperenambelas, dan tidak ada yang membutuhkan faktor 5.
Pemeriksaannya adalah pembagian panjang yang sama seperti pada desimal basis 10. Saat membagi 3 dengan 8 pada basis 2, sisanya mencapai nol dan penulisannya berhenti. Pada 1/10, sebaliknya, sisanya muncul kembali dan penulisannya tidak pernah habis, seperti ditunjukkan pembagian berikut.
Satu warisan berguna dari aturan ini muncul ketika komputer menangani ukuran yang sudah dinyatakan dalam setengah atau pangkat dua. Namun waspadai intuisi sebaliknya: desimal yang berhenti di layar tidak menjamin ia berhenti dalam biner. Sebaliknya justru berlaku: apa pun yang berhenti dalam biner juga berhenti pada basis 10, karena penyebutnya hanya memuat faktor 2.
Pembagian biner 1/10 langkah demi langkah
Pembagian panjang pada basis 2 menunjukkan mengapa blok 0011 berulang. Sisa dikalikan 2 dan satu angka dicatat; ketika sebuah sisa muncul lagi, urutan angkanya juga berulang.
Secara sederhana: ambil sisa 1, gandakan dan bandingkan dengan 10. Selama hasilnya kurang dari 10, angkanya 0. Saat mencapai 16 muncul angka 1 yang pertama, karena 16 ÷ 10 menyisakan hasil bagi 1. Setelah menghasilkan beberapa angka, sisa yang sama dengan sisa sebelumnya membuat langkah berikutnya identik. Kembalinya itu adalah tanda keberulangan, persis seperti pembagian 1 dengan 3 pada basis 10.
Berikut pembagian yang sama dalam bentuk tabel. Angkanya menunjukkan pola dan sisanya menandai kapan pola itu mulai lagi.
| Sisa awal | ×2 | Angka biner | Sisa baru |
|---|---|---|---|
| 1 | 2 | 0 | 2 |
| 2 | 4 | 0 | 4 |
| 4 | 8 | 0 | 8 |
| 8 | 16 | 1 | 6 |
| 6 | 12 | 1 | 2 |
| 2 | 4 | 0 | 4 |
Sisa baru 2 sudah muncul pada baris kedua. Dari situ daftar menelusuri lagi 4, 8, 6, 2 dan angka 0, 0, 1, 1 berulang tanpa henti. Baris yang berulang memuat empat angka: 0, 0, 1, 1. Itulah periodenya.
Membandingkan dengan toleransi dan bekerja dengan sen
Masalah praktis pertama muncul saat membandingkan hasil yang seharusnya sama. Jika sebuah program menghitung 0,1 + 0,2 lalu membandingkannya dengan 0,3 memakai kesamaan ketat, perbandingannya bisa gagal karena kedua bilangan biner itu tidak sama. Kebiasaan yang lazim adalah membandingkan dengan toleransi: menerima dua nilai sebagai sama jika selisih mutlaknya lebih kecil dari ambang kecil yang sesuai dengan masalahnya.
Toleransi itu harus dipilih dengan cermat. Ambang yang terlalu besar menyatakan sama nilai yang sebenarnya tidak sama; ambang yang terlalu kecil meloloskan galat yang menumpuk. Ambang itu bukan sifat universal: bergantung pada berapa banyak operasi yang dilakukan dan seberapa besar bilangannya. Perbandingan dengan toleransi adalah konvensi perhitungan, bukan bukti kesamaan eksak.
Masalah praktis kedua adalah uang. Menyimpan harga dan saldo dalam rupiah dengan desimal biner memunculkan selisih yang sama, yang menumpuk saat operasi diulang. Kebiasaan yang meluas adalah bekerja dengan sen: mengalikan dengan 100 lalu beroperasi dengan bilangan bulat. Bilangan bulat disimpan tanpa kehilangan, sehingga setiap penjumlahan sen tepat. Pada akhirnya dibagi 100 hanya untuk menampilkan nilainya. Ini cara menggambarkan aritmetikanya, dan keputusan konkretnya bergantung pada sistem.
Membantu juga untuk mengingat bahwa galat biner tiap operasi sangat kecil: pada presisi ganda, paling besar ≈ 1,1 × 10⁻¹⁶ secara relatif. Kesulitannya muncul ketika galat menumpuk pada perulangan yang panjang atau ketika nilai dibandingkan dengan kesamaan eksak.
Uji singkat: kenali desimal eksaknya
Sebelum melanjutkan, latihan untuk memantapkan aturannya.
- Apakah 1/8 berhenti pada basis 2? Ya: 8 = 2³ adalah pangkat 2, jadi 1/8 = 0,001₂ berhenti.
- Apakah 3/5 berhenti pada basis 2? Tidak: 5 adalah faktor prima yang bukan 2, jadi penulisan binernya berulang.
- Apakah 7/10 berhenti pada basis 10? Ya: penyebut tersederhana 10 = 2 × 5 hanya memiliki faktor 2 dan 5, jadi 7/10 = 0,7 berhenti.
Pertanyaan yang sama, dua basis berbeda. Cukup memfaktorkan penyebut pecahan paling sederhana dan membandingkan faktor primanya dengan faktor basis.
Bagaimana kalkulator ini menghindari galat tersebut
Kalkulator situs ini tidak menyimpan desimal sebagai bilangan biner perkiraan. Seperti dijelaskan dalam metodologi perhitungan, operasi rasional memakai bilangan bulat berpresisi arbitrer di peramban. Setiap pecahan dinormalkan: penyebutnya dijaga tetap positif, dan pembilang serta penyebutnya disederhanakan dengan faktor persekutuan terbesar.
Karena perhitungannya memakai bilangan bulat dan pecahan, 1/10 + 2/10 diselesaikan sebagai 3/10 tanpa melewati perkiraan biner. Pecahan yang dinormalkan itu eksak. Ketika alat juga menampilkan angka desimal, angka itu adalah penyajian perkiraan dan ditandai sebagai perkiraan; pecahan eksaknya tetap disimpan.
Ada baiknya memisahkan dua hal yang terdengar mirip. Perkiraan adalah penulisan desimal yang mendekati nilai tanpa menyamainya, seperti 0,333. Hasil eksak adalah pecahan paling sederhana, seperti 1/3, yang mewakili bilangan tanpa kehilangan. Galat perkiraan melekat pada penulisannya, bukan pada bilangan rasionalnya.
Untuk beralih dari pecahan ke desimalnya, dengan klasifikasi eksak atau berulang, gunakan alat pecahan ke desimal. Untuk arah sebaliknya, desimal ke pecahan membangun kembali pecahan eksak dari angka-angkanya.
Bolehkah saya memercayai hasil desimal dari mesin?
Boleh, sebatas batasnya. Desimal mesin berpresisi ganda tepat sampai sekitar lima belas angka signifikan, cukup untuk hampir semua pengukuran fisik biasa. Masalahnya bukan hasilnya tak berguna, melainkan bahwa hasil itu tidak dapat diperlakukan sebagai kesamaan eksak antarrasional.
Untuk menilai apakah suatu desimal andal, perhatikan tiga hal. Pertama, berapa banyak operasi yang menumpuk: setiap operasi menambah pembulatan kecil. Kedua, apakah membandingkan dengan kesamaan ketat atau dengan toleransi. Ketiga, apakah nilainya seharusnya rasional sederhana, seperti 3/10, yang dalam hal ini pecahan eksaknya menjadi acuan.
Ketika nilai harus eksak — misalnya saat memeriksa kesamaan antrapecahan — beroperasilah dengan pecahan atau bilangan bulat dan simpan desimalnya untuk penyajian. Desimal yang dibulatkan dipakai untuk membaca dan mengukur; pecahan dipakai untuk membuktikan.
Pertanyaan yang sering diajukan
Apakah komputernya salah atau jumlahnya yang salah?
Tidak ada yang salah. Penjumlahan dalam biner benar sesuai format yang dipakai komputer. Yang terjadi adalah 1/10 tidak punya penulisan biner berhingga, sehingga operandnya sudah dibulatkan. Desimal 0,3 juga tidak dapat diwakili secara eksak pada format itu.
Mengapa 1/3 tidak berhenti pada basis 10?
Karena penyebut tersederhananya, 3, tidak membagi pangkat 10 mana pun. Sepuluh hanya punya faktor prima 2 dan 5, dan 3 tidak membagi pangkat 10 mana pun. Itulah sebabnya pembagian 1 dengan 3 menyisakan sisa yang berulang dan angka 3 berlanjut tanpa akhir.
Pecahan eksak apa yang disimpan saat menulis 0,1?
Pada format biner presisi ganda, nilai yang disimpan tepat 3602879701896397/36028797018963968. Penyebutnya 2⁵⁵, sebuah pangkat 2, sesuai tuntutan format. Pecahan itu sedikit lebih besar dari 1/10; galatnya berorde 5,6 × 10⁻¹⁸.
Bagaimana membandingkan dua desimal yang seharusnya sama?
Bandingkan dengan toleransi: terima keduanya sama jika selisih mutlaknya lebih kecil dari ambang kecil. Ambangnya dipilih sesuai masalah, karena bertambah dengan jumlah operasi dan dengan besarnya nilai. Untuk kesamaan eksak, bandingkan pecahannya.
Apakah ini berarti aritmetika desimal itu salah?
Tidak. Bilangan rasional yang diwakili desimal itu bersifat eksak; yang diperkirakan hanyalah penulisannya pada basis yang tidak menguntungkannya. Bilangan yang sama dapat berpenulisan berhingga pada basis 10 dan berulang pada basis 2, dan tetap bilangan rasional yang sama. Pilihan basis mengubah penulisannya, bukan nilainya.
Kesimpulan
Alasan mengapa 0,1 + 0,2 bukan 0,3 di komputer adalah karena desimal disimpan dalam biner, dan 1/10 tidak memiliki penulisan biner berhingga karena penyebutnya memuat faktor prima 5. Komputer menyimpan perkiraan, menjumlahkannya, dan menampilkan 0,30000000000000004. Jumlah eksaknya, 1/10 + 2/10 = 3/10, tetap terjaga ketika bekerja dengan pecahan dan bilangan bulat, seperti yang dilakukan kalkulator pecahan. Memahami kriteria faktor prima memungkinkan kita membedakan hasil eksak dari perkiraan dan memilih bentuk yang tepat untuk setiap tugas.