Gunakan jenis loop for untuk mendapatkan hitungan yang aman. Hitunglah nilai-nilai floating dari variable 0 sampai 100.
double x;
int j;
for ( j = 0; j < 100; j++ )
{
x = j/10.0;
// do something with x
}
Hampir semua, menghitung floating point dengan jenis double precision bisa berhasil. Dan yang lebih presisi lagi adalah:
double x;
int j;
for ( j = 0; j < 160; j++ )
{
x = j/16.0;
// do something with x
}
Hal ini lebih baik karena 1/16 bisa direpresentasikan oleh biner dengan tepat.
Quest 19: apakah representasi floating point sama dengan fixed poin yang sedang kita bahas saat ini?
Jawab: No. Mereka berhubungan namun floating point lebih canggih. Bab selanjutnya kita akan membahas floating point
Senin, 06 Mei 2013
Berhitung dengan Integer
Jika tujuan fragmen program adalah berhitung sampai 100kali maka, berhitung di dalam loop bisa menggunakan bilangan bulat, berikut adalah contoh perbaikannya:
int x;
for ( x = 0; x < 100; x++ )
{
System.out.println("Crimson and Clover");
}
(sudah umum untuk menulis program dengan konvensi seperti ini meskipun program bisa mecapai x=100 dengan tepat.) berikut adalah solusi yang buruk:
float x;
for ( x = 0.0; x < 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Solusi tersebut mugkin memang bekerja seperti yang diharapkan. namun terdapat risiko kalau loop berhitung sampai 101 kali
int x;
for ( x = 0; x < 100; x++ )
{
System.out.println("Crimson and Clover");
}
(sudah umum untuk menulis program dengan konvensi seperti ini meskipun program bisa mecapai x=100 dengan tepat.) berikut adalah solusi yang buruk:
float x;
for ( x = 0.0; x < 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Solusi tersebut mugkin memang bekerja seperti yang diharapkan. namun terdapat risiko kalau loop berhitung sampai 101 kali
Infinity Loop yang Tersembunyi
Jika kita menggunakan basis 10, maka 0,1 akan ditambahkan ke x sebanyak 100kali sampai mencapai 10,0 dengan tepat. Tapi komputer menggunakan basis dua floating point, yang artinya tidak merepresentasikan nilai 0,1 secara tepat. Variabel x bisa jadi tidak akan mencapai nilai 10,0 dengan tepat dan program tidak akan looping tanpa henti.
float x;
for ( x = 0.0; x != 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Tidak hanya fixed point yang tidak bisa merepresentasikan sepersepuluh dengan benar, tetapi juga floating point yang biasa dipakai di bahasa pemrograman juga memiliki masalah yang sama.
float x;
for ( x = 0.0; x != 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Tidak hanya fixed point yang tidak bisa merepresentasikan sepersepuluh dengan benar, tetapi juga floating point yang biasa dipakai di bahasa pemrograman juga memiliki masalah yang sama.
Code yang Berbahaya
Berikut adalah sebuah fragmen program di Java. (Bisa juga di C atau C++). Apakah ada sesuatu di dalam program tersebut yang perlu kamu khawatirkan?
float x;
for ( x = 0.0; x != 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Quest 16: Berapa kali kah Crimson and Clover akan dicetak?
Jawab: Terus menerus
float x;
for ( x = 0.0; x != 10.0; x += 0.1 )
{
System.out.println("Crimson and Clover");
}
Quest 16: Berapa kali kah Crimson and Clover akan dicetak?
Jawab: Terus menerus
Hasil yang tidak berhenti
Pada gambar di bawah kita menggunakan algoritma untuk mengkonversi 0,110 menjadi biner.
Algoritma ini tidak pernah berhenti dan menghasilkan pola yang sama 0,2 0,4 0,8 1,6 0,6 1,2 0,2 tanpa henti. Hasilnya pola biner 0011 juga tidak akan berhenti seterusnya.
Quest: 15: Bisakah satu per tiga direpresentasikan secara presisi oleh desimal?
Jawab: Tidak 1/3 akan menghasilkan 0,3333.... secara tak terhingga
Masalah dengan sepersepuluh bukanlah masalah spesial yang perlu dihindari, karena dengan semua basis yang ada pasti mempunyai pecahan yang tidak presisi.
Algoritma ini tidak pernah berhenti dan menghasilkan pola yang sama 0,2 0,4 0,8 1,6 0,6 1,2 0,2 tanpa henti. Hasilnya pola biner 0011 juga tidak akan berhenti seterusnya.
Fakta yang tidak terduga: nilai "sepersepuluh" tidak bisa direpresentasikan secara presisi oleh pecahan biner.Hal ini benar di dalam biner notasi posisi maupun floating point yang digunakan di bahasa pemrograman. Kadang kadang hal ini membutuhkan pertimbangan penting ketika akurasi tinggi diperlukan.
| Decimal | Binary so far | |
|---|---|---|
| Start | 0,1 | 0, |
| ×2 | 0,2 | 0,0 |
| ×2 | 0,4 | 0,00 |
| ×2 | 0,8 | 0,000 |
| ×2 | 1,6 | 0,0001 |
| ,6 | 0,0001 | |
| ×2 | 1,2 | 0,00011 |
| 0,2 | 0,00011 | |
| ×2 | 0,4 | 0,000110 |
| ×2 | 0,8 | 0,0001100 |
| ×2 | 1,6 | 0,00011001 |
| ,6 | 0,00011001 | |
| ×2 | 1,2 | 0,000110011 |
| 0,2 | 0,000110011 | |
| ×2 | 0,4 | 0,0001100110 |
| ×2 | 0,8 | 0,00011001100 |
| Result | 0,00011001100... |
Quest: 15: Bisakah satu per tiga direpresentasikan secara presisi oleh desimal?
Jawab: Tidak 1/3 akan menghasilkan 0,3333.... secara tak terhingga
Masalah dengan sepersepuluh bukanlah masalah spesial yang perlu dihindari, karena dengan semua basis yang ada pasti mempunyai pecahan yang tidak presisi.
Konversi Representasi dari Desimal ke Biner
Seringkali kamu membutuhkan mengkonversi angka desimal semisal 7,625 menjadi sebuah angka biner. Pertama-tama konversi angka bulat nya (dalam kasus ini 7) menjadi biner (111 dalam kasus ini). Tambahkan koma sebagai pemisah pecahan kemudian konversi angka pecahan tersebut menjadi biner.
Sebagai contoh 7,625 adalah 111,1012 di kasus ini konversi berhenti setelah pecahan mencapai angka nol. Hal seperti ini tidak selamanya berhasil.
Untuk mengkonversi pecahan desimal menjadi pecahan biner: Kalikan angka tersebut dengan dua, kemudian ambil angka yang berada di depan koma, lakukan ini sampai isi dari pecahan tersebut menjadi nol.
| Decimal | Binary so far | |
|---|---|---|
| Start | 0,625 | 0, |
| ×2 | 1,250 | 0,1 |
| ,250 | 0,1 | |
| ×2 | 0,500 | 0,10 |
| ,500 | 0,10 | |
| ×2 | 1,000 | 0,101 |
| Result | ,000 | 0,101 |
Geser ke kiri satu bit
Mari kita kembali ke corat-coret kertas dan pensil. Berikut adalah angka biner:
Dan dari pola di atas kita geser ke kiri sejauh 1 langkah
Quest 12: Apa yang dihasilkan dari geser ke kiri sejauh 1 langkah?
Jawab: Dikalikan dengan dua
0001.0100 = 1.2510
Dan dari pola di atas kita geser ke kiri sejauh 1 langkah
0010.1000 = 2.5010
Quest 12: Apa yang dihasilkan dari geser ke kiri sejauh 1 langkah?
Jawab: Dikalikan dengan dua
Langganan:
Komentar (Atom)