Rabu, 21 Oktober 2015

Cara mengetahui kesalahan-kesalahan numeric dari komputer

Tutorial kali ini adalah bagaimana cara mengetahui kesalahan-kesalahan secara numeric dari komputer, yang mana ketelitian dari numeric pada saat perhitungan pada komputer merupakan kebutuhan yang sangat diperlukan terutama untuk para saintis atau enjiner. Sebagai contoh pada saat melakukan analisa spectral maka akan banyak sekali penambahan-penambahan kesalahan numeric yang terjadi dan tersu terakumulasi sehingga error akan selalu muncul.

Berikut adalah tes bagaimana cara mengetahui kesalahan numeric terjadi.

  1. 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;
    
  2. 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;
    
  3. 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;
    
  4. Sebagai contoh untuk melihat bagaimana akumulasi kesalahan secara numeric terjadi pada penjumlah sin sebanyak 100000 dan hasilnya seperti beikut:
  5. 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