(Lengkap) Tutorial untuk memahami IEEE Floating-Point kesalahan

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 42980 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Floating-point matematika adalah topik yang kompleks yang membingungkan banyak pemrogram. Tutorial di bawah ini akan membantu Anda mengenali pemrograman situasi di mana floating-point kesalahan mungkin terjadi dan bagaimana menghindari mereka. Itu juga harus memungkinkan Anda untuk mengenali kasus yang disebabkan oleh inheren floating-point matematika keterbatasan yang bertentangan dengan sebenarnya kompiler bug.

INFORMASI LEBIH LANJUT

Desimal dan sistem bilangan biner

Biasanya, kita menghitung hal-hal dalam basis 10. Basis adalah benar-benar sewenang-wenang. Satu-satunya alasan bahwa orang telah secara tradisional menggunakan basis 10 adalah bahwa mereka memiliki 10 jari, yang telah membuat berguna menghitung alat-alat.

Nomor 532.25 di desimal (basis 10) berarti berikut:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Dalam sistem bilangan biner (basis 2), setiap kolom mewakili kekuatan 2 bukannya 10. Sebagai contoh, nomor 101.01 berarti berikut:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Bagaimana bilangan bulat diwakili di PC

Karena ada tidak ada bagian fraksional ke integer, mesin yang representasi ini jauh lebih sederhana daripada bagi nilai-nilai floating-point. Normal bilangan bulat pada komputer pribadi (PC) adalah 2 byte (16 bit) lama dengan bit paling signifikan menunjukkan tanda. Bilangan bulat panjang adalah 4 byte yang panjang. Nilai-nilai positif yang mudah bilangan biner. Misalnya:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Namun, bilangan bulat negatif diwakili menggunakan dua komplemen skema. Untuk mendapatkan dua 's melengkapi perwakilan untuk negatif nomor, mengambil biner untuk nilai mutlak nomor dan kemudian flip semua bit dan menambahkan 1. Misalnya:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Perhatikan bahwa-1 desimal = 1111 1111 1111 1111 dalam biner, yang menjelaskan Mengapa Basic memperlakukan-1 sebagai benar logis (semua bit = 1). Ini adalah akibat dari tidak memiliki terpisah operator untuk bitwise dan logis perbandingan. Sering di dasar, lebih mudah untuk menggunakan kode fragmen di bawah ini ketika program Anda akan membuat banyak perbandingan logis. Ini sangat membantu mudah dibaca.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Perhatikan bahwa menambahkan kombinasi dari dua 's melengkapi nomor bersama-sama menggunakan aritmatika biner biasa menghasilkan hasil yang benar.

Komplikasi floating-Point

Setiap bulat desimal dapat persis diwakili oleh integer biner; Namun, hal ini tidak benar untuk angka pecahan. Pada kenyataannya, setiap nomor yang tidak rasional di basis 10 juga akan irasional dalam sistem dengan basa yang lebih kecil dari 10.

Untuk ganda, dalam jumlah tertentu, hanya fraksional yang dapat diwakili dalam bentuk p/q, di mana q adalah bilangan bulat kekuasaan 2, dapat menyatakan persis, dengan jumlah terbatas bit.

Bahkan umum pecahan desimal, seperti 0,0001 desimal, tidak dapat mewakili tepat dalam biner. (0,0001 adalah sebagian kecil biner berulang dengan periode 104 bit!)

Ini menjelaskan mengapa contoh sederhana, seperti berikut
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

akan mencetak 1.000054 keluaran. Kesalahan kecil dalam mewakili 0,0001 biner menjalar ke jumlah.

Untuk alasan yang sama, Anda harus selalu menjadi sangat berhati-hati ketika membuat Perbandingan pada bilangan real. Contoh berikut menggambarkan kesalahan pemrograman umum:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Ini tidak akan mencetak "Kesetaraan!" karena 69.82 tidak dapat mewakili tepat dalam biner, yang menyebabkan nilai yang dihasilkan dari tugas sedikit berbeda (dalam biner) dari nilai yang dihasilkan dari ekspresi. Dalam prakteknya, Anda harus selalu kode seperti perbandingan sedemikian rupa untuk memungkinkan beberapa toleransi. Untuk contoh:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Ini akan mencetak "Sama".

IEEE Format angka

QuickBasic untuk MS-DOS, versi 3.0 dikirim dengan MBF Versi (Microsoft biner Floating Point) dan IEEE (Institut Versi Electrical and Electronics Engineers) untuk mesin dengan prosesor pembantu matematika. QuickBasic untuk MS-DOS, versi 4.0 dan kemudian hanya menggunakan IEEE. Microsoft memilih standar IEEE untuk mewakili nilai floating-point dalam versi terbaru dari dasar untuk berikut tiga alasan utama:
  1. Untuk memungkinkan dasar menggunakan Intel matematika coprocessors, yang menggunakan IEEE format. Intel 80 x 87 seri coprocessors tidak bisa bekerja dengan Microsoft biner Format angka.
  2. Untuk membuat interlanguage memanggil antara Basic, C, Pascal, FORTRAN, dan MASM lebih mudah. Jika tidak, konversi rutinitas harus digunakan untuk mengirim nilai-nilai numerik dari satu bahasa lain.
  3. Untuk mencapai konsistensi. IEEE adalah standar untuk industri diterima Kompiler c dan FORTRAN.
Berikut adalah perbandingan cepat representasi IEEE dan MBF double-precision nomor:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Untuk informasi lebih lanjut tentang perbedaan antara IEEE dan MBF floating-point representasi, permintaan di Basis Pengetahuan Microsoft di kata-kata berikut:
   IEEE and floating and point and appnote
				

Perhatikan bahwa IEEE memiliki lebih bit yang didedikasikan untuk eksponen, yang memungkinkan itu untuk mewakili nilai-nilai lebih luas. MBF memiliki lebih mantissa bit yang memungkinkan untuk lebih tepatnya dalam kisaran sempit.

Konsep-konsep Floating-Point umum

Sangat penting untuk menyadari bahwa sistem floating-point biner dapat mewakili hanya sejumlah terbatas dari nilai-nilai floating-point di tepat bentuk. Nilai lainnya harus dihampiri dengan terdekat nilai representable. Standar IEEE merinci metode untuk mengitari nilai untuk nilai representable "dekat". QuickBasic untuk MS-DOS mendukung standar dan putaran menurut IEEE aturan.

Juga, perlu diketahui bahwa angka-angka yang dapat direpresentasikan dalam IEEE tersebar dengan jarak yang sangat luas. Anda dapat membayangkan mereka pada nomor baris. Ada kepadatan tinggi jumlah representable dekat 1.0 dan-1.0 tapi lebih sedikit dan lebih sedikit seperti Anda pergi ke 0 atau tak terhingga.

Tujuan dari standar IEEE, yang dirancang untuk teknik perhitungan, adalah untuk memaksimalkan akurasi (untuk mendapatkan sedekat mungkin untuk sebenarnya nomor). Presisi merujuk kepada jumlah digit yang Anda dapat mewakili. Standar IEEE berusaha untuk menyeimbangkan jumlah bit didedikasikan untuk eksponen dengan jumlah bit yang digunakan untuk pecahan bagian dari nomor, untuk menjaga keakuratan dan ketepatan dalam batas-batas yang dapat diterima.

IEEE rincian

Angka floating-point diwakili dalam bentuk berikut, di mana [eksponen] adalah eksponen biner:
   X =  Fraction * 2^(exponent - bias)
				

[Sebagian] adalah bagian fraksional dinormalkan nomor, dinormalisasi karena dengan eksponen diatur sehingga sedikit terkemuka selalu 1. Ini cara, itu tidak harus disimpan, dan Anda mendapatkan satu lebih sedikit presisi. Inilah sebabnya mengapa ada sedikit tersirat. Anda dapat memikirkan ini seperti notasi ilmiah, di mana Anda memanipulasi eksponen untuk memiliki satu digit ke kiri dari titik desimal, kecuali dalam biner, Anda selalu dapat memanipulasi dengan eksponen sehingga bit pertama adalah 1, sejak ada hanya 1s dan 0s.

[bias] adalah nilai panjar yang digunakan untuk menghindari keharusan untuk menyimpan negatif eksponen.

Bias untuk nomor presisi tunggal adalah 127 dan 1023 (desimal) untuk Double-precision nomor.

Nilai-nilai yang sama untuk semua 0 dan semua 1 (ganda) disediakan untuk mewakili kasus khusus. Ada kasus-kasus khusus lain juga, yang menunjukkan berbagai kondisi kesalahan.

Presisi tunggal contoh

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 0000 = 4000 hex
Perhatikan tanda sedikit adalah nol, dan eksponen disimpan adalah 128, atau 100 0000 0 dalam biner, yang adalah 127 plus 1. Mantissa disimpan adalah (1.) 000 0000... 0000 0000, yang memiliki 1 terkemuka tersirat dan titik biner, sehingga mantissa sebenarnya adalah 1.

-2 = 1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Sama seperti + 2 kecuali bahwa tanda sedikit diatur. Hal ini berlaku untuk semua IEEE format angka floating-point.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... hex 0000 0000 0000 = 4080
Sama mantissa, eksponen bertambah satu (bias nilai adalah 129, atau 100 0000 1 dalam biner.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Sama eksponen, mantissa lebih besar setengah-- (1.) 100 0000... 0000 0000, yang, karena ini adalah bintang ganda fraksi, adalah 1-1/2 (nilai-nilai angka pecahan adalah 1/2, 1/4, 1/8, dll.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Sama eksponen sebagai kekuatan lain dari 2, mantissa adalah salah satu kurang 2 127, atau 011 1111 1 dalam biner.

75 = 1.5 * 2 ^-1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Eksponen bias adalah 126, 011 1111 0 dalam biner, dan dalam mantissa (1.) 100 0000... 0000 0000, yang adalah 1-1/2.

2,5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 = 4020 0000 0000 hex
Persis sama dengan 2 kecuali bahwa bit yang mewakili 1/4 adalah menetapkan di dalam mantissa.

0,1 = 1.6 * 2 ^-4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 adalah sebagian kecil berulang dalam biner. Dalam mantissa hanya malu 1.6, dan bias eksponen mengatakan bahwa 1.6 adalah untuk dibagi oleh 16 (itu adalah 011 1101 1 dalam biner, yang merupakan 123 dalam desimal). Sejati eksponen adalah 123-127 = - 4, yang berarti bahwa faktor yang untuk melipatgandakan adalah 2 **-4 = 1/16. Perhatikan bahwa mantissa disimpan dibulatkan dalam sedikit terakhir. Ini adalah usaha untuk mewakili unrepresentable nomor akurat mungkin. (Alasan yang 1/10 dan 1/100 tidak benar-benar representable dalam biner mirip dengan cara bahwa 1/3 tidak benar-benar representable dalam desimal.)

0 = 1.0 * 2 ^ -128 = semua Zero - kasus khusus.

Kesalahan Floating-Point umum lainnya

Berikut ini adalah kesalahan floating-point umum:
  1. Putaran dari kesalahan

    Kesalahan ini terjadi bila semua bit bilangan biner tidak digunakan dalam perhitungan.

    Contoh: Menambahkan 0,0001 untuk 0.9900 (Single presisi)

    0,0001 Desimal akan diwakili sebagai:
    10100011011011100010111 (1.) * 2^(-14+Bias) (13 memimpin 0s di Biner!)
    0.9900 akan diwakili sebagai:
    11111010111000010100011 (1.) * 2^(-1+Bias)
    Sekarang untuk benar-benar menambahkan angka-angka ini, harus poin (biner) desimal selaras. Untuk ini mereka harus Unnormalized. Di sini adalah dihasilkan tambahan:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Ini disebut putaran dari kesalahan karena beberapa komputer putaran ketika pergeseran untuk tambahan. Orang lain hanya memotong. Putaran dari kesalahan penting untuk mempertimbangkan setiap kali Anda menambahkan atau mengalikan dua nilai yang sangat berbeda.
  2. Dua subtracting hampir sama dengan nilai-nilai
           .1235
          -.1234
           _____
           .0001
    
    						
    Ini akan dinormalisasi. Perhatikan bahwa meskipun angka asli masing-masing memiliki empat digit, hasilnya telah hanya satu angka yang signifikan.
  3. Melimpah dan underflow

    Hal ini terjadi ketika hasilnya terlalu besar atau terlalu kecil untuk menjadi diwakili oleh jenis data.
  4. Kesalahan quantizing

    Hal ini terjadi dengan angka-angka yang tidak dapat dinyatakan dengan tepat bentuk oleh standar floating-point.
  5. Divisi oleh sejumlah kecil

    Ini dapat memicu kesalahan "membahagi dengan nol" atau dapat menghasilkan buruk hasil, seperti dalam contoh berikut:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    Dalam QuickBasic untuk MS-DOS, X sekarang memiliki nilai 888887, bukan jawaban yang benar, 900000.
  6. Keluaran kesalahan

    Jenis kesalahan terjadi ketika fungsi output mengubah nilai-nilai mereka bekerja dengan.

Properti

ID Artikel: 42980 - Kajian Terakhir: 14 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
Kata kunci: 
kbmt KB42980 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:42980
Sanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com