- Type data, dengan menggunakan type data yang menggunakan 4 byte saja memiliki kesalahan yang cukup signifikan, dalam Delphi type ini adalah single sedangkan untuk tipe data yang menggunakan 8 byte memiliki ketelitian yang lebih tinggi seperti real atau double dan tipe data extended merupakan tipe data yang menggunakan 10 byte dengan ketelitian sampai 18 digit.
Perhatikan gambar di bawah ini, pada tipe single ketelitian hanya sampai 7 digit saja sedangkan pada tipe real bisa mencapai 16 digit, dan extended sampai 18 digit.
procedure TForm1.Button1Click(Sender: TObject); var a1:single; a2:real;// or double a3:extended; begin a1:=1/3; a2:=1/3; a3:=1/3; memo1.Lines.Append(format('a1=1/3 (single)'#9'%0.18f',[a1])); memo1.Lines.Append(format('a2=1/3 (real)'#9'%0.18f',[a2])); memo1.Lines.Append(format('a3=1/3 (extended)'#9'%0.18f',[a3])); end;
- Copy data dari tipe data yang berbeda. Pada dasarnya copy data dari tipe data yang berbeda merupakan sumber utama kesalahan numeric. Perhatikan contoh berikut, ketika tipe data real menyimpan data dari single maka kesalahan numeric dari single akan ikut serta. Begitu pula ketika tipe data real dan single dikopi ke tipe data extended maka kesalahannya akan ikkut serta pula ke dalam extended.
procedure TForm1.Button2Click(Sender: TObject); var a1:single; a2:real;// or double a3:extended; begin a1:=1/3; a2:=a1; a3:=a1; memo1.Lines.Append(format('a1=1/3 (single)'#9'%0.18f',[a1])); memo1.Lines.Append(format('a2=a1 (real)'#9'%0.18f',[a2])); memo1.Lines.Append(format('a3=a1 (extended)'#9'%0.18f',[a3])); end;
- Kesalahan numeric yang tak kalah penting lagi adalah jumlah digit belakang koma sangat tergantung sekali pada jumlah digit di depan koma. Dan perhatikan contoh berikut :
procedure TForm1.Button3Click(Sender: TObject); var a1,a2:extended; begin a1:=1/3; a2:=100000000000000/3; memo1.Lines.Append(format('a1=1/3'#9#9#9'%0.18f',[a1])); memo1.Lines.Append(format('a2=100000000000000/3'#9'%0.18f',[a2])); memo1.Lines.Append(format('a1+a2'#9#9#9'%0.18f',[a1+a2])); end;
- Sebagai contoh untuk melihat bagaimana akumulasi kesalahan secara numeric terjadi pada penjumlah sin sebanyak 100000 dan hasilnya seperti beikut:
-
procedure TForm1.Button4Click(Sender: TObject); var a1:extended; i:integer; begin randomize; a1:=sin(pi/5); memo1.Lines.Append(format('a1=sin(pi/5)'#9#9#9'%0.18f',[a1])); for i:=0 to 100000 do a1:=a1+sin(pi/(random(10)+1)); memo1.Lines.Append(format('100000 a1=a1+sin(pi/random)'#9#9'%0.18f',[a1])); end;
Kesalahan numeric ini terjadi pada bahasa pemrograman yang lain. Sepert pada bahasa pemrograman fortran.
Semoga ini memberikan pencerahan yang cukup.
Dapat juga lihat videonya
Tidak ada komentar:
Posting Komentar