Algoritma akan berhenti setelah mencapai batas nilai machine epsilon yang berbeda untuk setiap tipe data. Jumlah iterasi tergantung pada presisi tipe data. Algoritma tidak akan berhenti jika tidak ada batasan.
1. import java.math.*;
class Anum2 {
public static void main(String args[]) {
float x = 1;
int counter = 0;
while (x + 1 > 1) {
x = x / 2;
++counter;
}
System.out.println(counter + " " + x);
}
}
Kelompok Diskusi 1B :
1. A. Fadhil Aprilianto - 1206241325
2. Fakhrirozi Sulaiman - 1206208095
3. Fiqie Budi Z - 1206243596
4. M. Devakto - 1206238671
5. Ridwan Arvihafiz – 1206208050
Discussion 1.b. : To infinity and beyond!
Say x = 1
While 1 + x is larger than 1, x = x / 2
Does that algorithm terminate, although x never goes to zero? Why?
For what value of x and how many iterations does the loop actually terminate?
Answer :
Untuk menjawab pertanyaan pertama apakah algoritma tersebut terminate atau tidak, kami terlebih
dahulu melakukan serangkaian percobaan untuk pertanyaan kedua agar mendapatkan kepastian dalam
menjawab pertanyaan pertama.
Dalam pertanyaan kedua, untuk mendapatkan nilai x dan berapa banyak iterasi yang dilakukan kami
melakukan serangkaian percobaan. Kami melakukannya melalui bahasa pemrograman Java dengan
beberapa tipe data primitif maupun bukan yang di compile melalui command prompt.
Percobaan 1. Data Type Float
Menghasilkan Output :
Dapat dilihat bahwa untuk data type float,
maka menghasilkan 24 kali iterasi dan x =
5.9604645E-8.
2. import java.math.*;
class Anum2 {
public static void main(String args[]) {
double x = 1;
int counter = 0;
while (x + 1 > 1) {
x = x / 2;
++counter;
}
System.out.println(counter + " " + x);
}
}
import java.math.*;
class Anum2 {
public static void main(String args[]) {
long x = 1;
int counter = 0;
while (x + 1 > 1) {
x = x / 2;
++counter;
}
System.out.println(counter + " " + x);
}
}
Percobaan 2. Data Type Double
Menghasilkan Output :
Dapat dilihat bahwa untuk data type double,
maka menghasilkan 53kali iterasi dan x =
1.1102230246251565E-16
Percobaan 3. Data Type Long
Menghasilkan Output :
Dapat dilihat bahwa untuk data type long,
maka menghasilkan 1kali iterasi dan x = 0
3. import java.math.*;
class Anum {
public static void main(String args[]) {
BigDecimal x = new BigDecimal(1);
int counter = 0;
while (new
BigDecimal(1).add(x).compareTo(new
BigDecimal(1)) > 0 && counter < 53) {
x = x.divide(new BigDecimal(2));
++counter;
}
System.out.println(counter + " " + x);
}
}
Dapat dilihat dari percobaan diatas bahwa setiap data type memiliki jumlah iterasi dan x yang berbeda-
beda. Dimana tipe data float menerapkan standar IEEE Single Precision dan tipe data double menerapkan
standar IEEE Double Precision. Hal ini disebabkan karena terdapat machine epsilon yang membatasi
bilangan titik ambang (floating point) yang dikenali oleh komputer. Untuk percobaan algoritma tersebut,
maka machine epsilon tersebut memiliki batas nilai sebesar dimana b merupakan
base dari bilangan tersebut yaitu 2 dan p merupakan precision dan nilainya tergantung dari tipe data
tersebut. Untuk batas nilai pada percobaan tersebut, maka komputer akan melakukan pula rounding by
nearest. Hal ini dibuktikan dengan melakukan percobaan berikut.
Percobaan 4. Big Decimal
Menghasilkan Output :
Dapat dilihat bahwa untuk data BigDecimal dengan
melakukan iterasi (precision) sebanyak jumlah tipe data
double, maka menghasilkan nilai yang lebih akurat. Hal
ini menunjukan bahwa terbukti terdapat rounding by
nearest untuk tipe data double.
Hal ini juga berlaku jika kita mengubah iterasi (precision)
pada code tersebut yakni sebanyak jumlah tipe data
float, maka menghasilkan nilai yang lebih akurat pula.
Dapat dilihat pada tipe data float, dilakukan
rounding by nearest pada saat x= 5.96046447…E-
8 sehingga dibulatkan menjadi x = 5.9604645E-8.
Sehingga dapat disimpulkan untuk menjawab pertanayaan kedua, diketahui bahwa nilai x pada saat
terminate tergantung pada tipe data atau dengan kata lain model representasi bilangan titik ambang
(floating point) dimana x akan berhenti melakukan loop pada x < machine epsilon dan banyaknya iterasi
(loop) tergantung dari precision atau mantissa dalam floating point sistem IEEE setelah di normalisasi.
4. import java.math.*;
class Anum {
public static void main(String args[]) {
BigDecimal x = new BigDecimal(1);
int counter = 0;
while (new
BigDecimal(1).add(x).compareTo(new
BigDecimal(1)) > 0 && counter < 1000000) {
x = x.divide(new BigDecimal(2));
++counter;
}
System.out.println(counter + " " + x);
}
}
Untuk menjawab pertanyaan pertama kami melakukan percobaan tambahan pada tipe BigDecimal,
Dapat dilihat hanya dengan mengganti kondisi
yang dibatasi hingga 1 juta saja algoritma
tersebut tidak terminate (setidaknya hingga
ditunggu > 1 jam).
Sehingga untuk menjawab pertanyaan pertama apakah algoritma akan terminate atau tidak, maka
algoritma tersebut akan terminate jika memiliki finite loop yakni saat x < machine epsilon, namun jika
algoritma tersebut tidak memiliki batasan berupa machine epsilon maka algoritma tersebut tidak akan
terminate. Machine epsilon digunakan karena dibutuhkan untuk membatasi pemakaian memori.
Nilai x tidak pernah ke 0 (setidaknya tidak untuk tipe data int, long, dsb karena sekali iterasi menghasilkan
0 seperti pada percobaan sebelumnya), karena terdapat machine epsilon pada setiap tipe data tersebut
yang merupakan bilangan positif terkecil dan merupakan maksimum relative error dari system titik
ambang (floating point) yang artinya jika ditambah atau dikurangi nilai tidak akan berubah (mentok)
sehingga tidak akan pernah sampai ke 0.
References :
1. Higham, N.J., Stability and Accuracy of Numerical Algorithms, SIAM.
2. Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; and Flannery, Brian P.; Numerical Recipes
in Fortran 77, 2nd ed.
3. Basaruddin, T., Komputasi Numerik, LP FEUI.