Numerik: Bermain-main dengan Error Pembulatan (epsilon mesin) Analisis Numerik


Long time no post, ya seperti judulnya kali ini saya mempelajari kembali numerik analisis dari yang paling dasarnya. Ini karena sepertinya ada beberapa miss pada konsep numerik yang saya pahami selama ini dan miskonsepsi itu lebih buruk daripada tidak tahu menurut saya. Salah satunya mungkin adalah tentang error, jadi mari kita kembali ke dasar. Berikut adalah beberapa pendapat saya tentang error pembulatan berdasarkan referensi-referensi yang saya baca.

Jadi, dalam analisis numerik ada 2 jenis error, yaitu:

-error pemotongan dan diskritisasi
-error pembulatan

Error pemotongan dan diskritisasi itu berhubungan erat, ini adalah error yang disebabkan oleh algoritma komputasi sedangkan error pembulatan adalah error yang terjadi karena komputer yang dipakai untuk komputasi. Dan yang kali ini yang akan kita bahas adalah error pembulatan.

Error pembulatan tidak bisa di hindari, kecuali kita memakai bentuk pecahan. Contohnya bilangan 1/3 bentuk desimalnya adalah 0,3333... sampai tak hingga ada deretan angka 3 dibelakang koma itu. Semisal kita ingin merepresentasikan 1/3 dengan 3 angka dibelakang koma maka bentuk desimalnya jadi 0.333. Tapi 0.333 bukan bentuk desimal yang tepat untuk pecahan 1/3. 0.333 bentuk pecahan tepatnya adalah 333/1000.

Karena komputer kita punya batas memori dan cpu maka dilakukan pendekatan sehingga error pasti ada. Dan error inilah yang bergantung dengan nilai epsilon yang akan kita cari. Jadi, epsilon disini itu konsepnya mirip atom yang tidak bisa di bagi-bagi lagi karena sudah merupakan penyusun terkecil

Dengan mengetahui nilai epsilon ini, setidaknya kita bisa sedikit memprediksi error pembulatan yang dilakukan komputer kita dan dengan memprediksi artinya kita mengendalikan error yang akan keluar. Dan pengendalian error inilah yang merupakan salah satu esensi dari analisis numerik.

Misal kita nilai epsilon komputer kita adalah 0.1 maka, berapa hasil yang kita dapatkan ketika melakukan operasi penjumlahan


1 + 0.05 = ?

Hasilnya adalah

1

Karena komputer membulatkan nilai dibawah 0.1 menjadi 0. Maka dengan asumsi ini kita buat program untuk mengetahui epsilon dari komputer kita masing-masing. Sudah jadi dan kodingnya bisa di download di sini.

#!/usr/bin/python

import sys
import numpy

maks = 1.0
mins = 0.0

while True:
 test = (maks + mins) / 2.0
 if (1.0 + test) != 1.0:
  maks = test
 else:
  maks = test
  break
print 'the epsilon is %.50f' % (maks)


Mari kita jalankan kode ini dan dapatkan hasilnya.

 ~$ chmod 777 epsilon.py  
 ~$ ./epsilonb.py  
 the epsilon is 0.00000000000000011102230246251565404236316680908203  

Dan kita dapatkan hasilnya yaitu sekitar 1,1 x 10-16. Ingin bukti dari teori yang kita kemukakan sebelumnya? Mari kita edit sedikit kodenya untuk memprint hasil penjumlahan dari 1 + nilai epsilon yang kita dapatkan ini. Walaupun sebenarnya dari di dapatkan nilai epsilon ini sudah terbukti teori tersebut.

 #!/usr/bin/python  
 import sys  
 import numpy  
 maks = 1.0  
 mins = 0.0  
 while True:  
      test = (maks + mins) / 2.0  
      if (1.0 + test) != 1.0:  
           maks = test  
      else:  
           maks = test  
           break  
 print 'the epsilon is %.50f' % (maks)  
 print 'penjumlahan 1 + epsilon = %.50f' % (1+maks)  

Dan kita jalankan lalu kita dapatkan dan terbukti.

 ~$ ./epsilon.py  
 the epsilon is 0.00000000000000011102230246251565404236316680908203  
 penjumlahan 1 + epsilon = 1.00000000000000000000000000000000000000000000000000  

Ingin mendapatkan bentuk pecahan dari epsilon? Bisa!

 #!/usr/bin/python  
 import sys  
 import numpy  
 maks = 1.0  
 mins = 0.0  
 frag = 0  
 while True:  
      frag = frag + 1  
      test = (maks + mins) / 2.0  
      if (1.0 + test) != 1.0:  
           maks = test  
      else:  
           maks = test  
           break  
 print 'the epsilon is %.50f' % (maks)  
 print 'penjumlahan 1 + epsilon = %.50f' % (1+maks)  
 print 'bentuk pecahan dari epsilon adalah 1/2^%i' % (frag)  

Kita jalankan lagi dan dapatkan yang kita inginkan.

 ~$ ./epsilon.py  
 the epsilon is 0.00000000000000011102230246251565404236316680908203  
 penjumlahan 1 + epsilon = 1.00000000000000000000000000000000000000000000000000  
 bentuk pecahan dari epsilon adalah 1/2^53  

Ya, dan selasailah main-main kita dengan nilai epsilon. Postingan yang cukup sepele sih, mungkin karena saya sudah kehabisan ide(?) Setelah ini mungkin saya akan lebih banyak lagi main-main dengan python dan memperdalam analisis numerik. Sekian.

referensi:
http://stackoverflow.com/questions/3478743/trying-to-write-a-code-for-finding-the-machine-epsilon, di akses tanggal 31 Desember 2016
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html, di akses tanggal 31 Desember 2016

Komentar