Arithmatic Logical Unit (ALU) Juga Bertugas membentuk fungsi – fungsi pengolahan data komputer. ALU sering disebut mesin bahasa (machine language) karena bagian ini mengerjakan instruksi – instruksi bahasa mesin yang diberikan padanya. ALU terdiri dari dua bagian, yaitu unit arithmetika dan unit logika boolean, yang masing – masing memiliki spesifikasi dan tugas tersendiri. Fungsi-fungsi yang didefinisikan pada ALU adalah Add (penjumlahan), Addu (penjumlahan tidak bertanda), Sub (pengurangan), Subu (pengurangan tidak bertanda), and, or, xor, sll (shift left logical), srl (shift right logical), sra (shift right arithmetic), dan lain-lain.
Arithmetic Logical Unit (ALU) merupakan unit penalaran secara logic. ALU ini merupakan Sirkuit CPU berkecepatan tinggi yang bertugas menghitung dan membandingkan. Angka-angka dikirim dari memori ke ALU untuk dikalkulasi dan kemudian dikirim kembali ke memori. Jika CPU diasumsikan sebagai otaknya komputer, maka ada suatu alat lain di dalam CPU tersebut yang kenal dengan nama Arithmetic Logical Unit (ALU), ALU inilah yang berfikir untuk menjalankan perintah yang diberikan kepada CPU tersebut.
ALU sendiri merupakan suatu kesatuan alat yang terdiri dari berbagai komponen perangkat elektronika termasuk di dalamnya sekelompok transistor, yang dikenal dengan nama logic gate, dimana logic gate ini berfungsi untuk melaksanakan perintah dasar matematika dan operasi logika. Kumpulan susunan dari logic gate inilah yang dapat melakukan perintah perhitungan matematika yang lebih komplit seperti perintah “add” untuk menambahkan bilangan, atau “devide” atau pembagian dari suatu bilangan. Selain perintah matematika yang lebih komplit, kumpulan dari logic gate ini juga mampu untuk melaksanakan perintah yang berhubungan dengan logika, seperti hasil perbandingan dua buah bilangan.
Instruksi yang dapat dilaksanakan oleh ALU disebut dengan instruction set. Perintah yang ada pada masing-masing CPU belum tentu sama, terutama CPU yang dibuat oleh pembuat yang berbeda, katakanlah misalnya perintah yang dilaksanakan oleh CPU buatan Intel belum tentu sama dengan CPU yang dibuat oleh Sun atau perusahaan pembuat mikroprosesor lainnya. Jika perintah yang dijalankan oleh suatu CPU dengan CPU lainnya adalah sama, maka pada level inilah suatu sistem dikatakan compatible. Sehingga sebuah program atau perangkat lunak atau software yang dibuat berdasarkan perintah yang ada pada Intel tidak akan bisa dijalankan untuk semua jenis prosesor,kecuali untuk prosesor yang compatible dengannya.
Seperti halnya dalam bahasa yang digunakan oleh manusia, instruction set ini juga memiliki aturan bahasa yang bisa saja berbeda satu dengan lainnya. Bandingkanlah beda struktur bahasa Inggris dengan Indonesia, atau dengan bahasa lainnya, begitu juga dengan instruction set yang ada pada mesin, tergantung dimana lingkungan instruction set itu digunakan.
- STRUKTUR DAN CARA KERJA PADA ALU
ALU akan bekerja setelah mendapat perintah dari Control Unit yang terletak pada processor. Contorl Unit akan memberi perintah sesuai dengan komando yang tertulis(terdapat) pada register. Jika isi register memberi perintah untuk melakukan proses penjumlahan, maka PC akan menyuruh ALU untuk melakukan proses penjumlahan. Selain perintah, register pun berisikan operand-operand. Setelah proses ALU selesai, hasil yang terbentuk adalah sebuah register yang berisi hasil atau suatuperintah lainnya. Selain register, ALU pun mengeluarkan suatu flag yang berfungsi untuk memberi tahu kepada kita tentang kondisi suatu processor seperti apakah processor mengalami overflow atau tidak.
ALU (Arithmethic and Control Unit) adalah bagian dari CPU yang bertanggung jawab dalam proses komputasi dan proses logika. Semua komponen pada CPU bekerja untuk memberikan asupan kepada ALU sehingga bisa dikatakan bahwa ALU adalah inti dari sebuah CPU. Perhitungan pada ALU adalah bentuk bilangan integer yang direpresentasikan dengan bilangan biner. Namun, untuk saat ini, ALU dapat mengerjakan bilangan floating point atau bilangan berkoma, tentu saja dipresentasikan dengan bentuk bilangan biner. ALU mendapatkan data (operand, operator, dan instruksi) yang akan disimpan dalam register. Kemudian data tersebut diolah dengan aturan dan sistem tertentu berdasarkan perintah control unit. Setelah proses ALU dikerjakan, output akan disimpan dalam register yang dapat berupa sebuah data atau sebuah instruksi. Selain itu, bentuk output yang dihasilkan oleh ALU berupa flag signal. Flag signal ini adalah penanda status dari sebuah CPU. Bilangan Ineger Bilangan integer (bulat) tidak dikena oleh komputer dengan basis 10. Agar komputer mengenal bilangan integer, maka para ahli komputer mengkonversi basis 10 menjadi basis 2. Seperti kita ketahui, bahwa bilangan berbasis 2 hanya terdiri atas 1 dan 0. Angka 1 dan 0 melambangkan bahwa 1 menyatakan adanya arus listrik dan 0 tidak ada arus listrik. Namun, untuk bilangan negatif, computer tidak mengenal simbol (-). Komputer hanya mengenal simbol 1 dan 0. Untuk mengenali bilangan negatif, maka digunakan suatu metode yang disebut dengan Sign Magnitude Representation. Metode ini menggunakan simbol 1 pada bagian paling kiri (most significant) bit. Jika terdapat angka 18 = (00010010)b, maka -18 adalah (10010010)b. Akan tetapi, penggunaan sign-magnitude memiliki 2 kelemahan. Yang pertama adalah terdaptnya -0 pada sign magnitude[0=(00000000)b; -0=(10000000)b]. Seperti kita ketahui, angka 0 tidak memiliki nilai negatif sehingga secara logika, sign-magnitude tidak dapat melakukan perhitungan aritmatika secara matematis. Yang kedua adalah, tidak adanya alat atau software satupun yang dapat mendeteksi suatu bit bernilai satu atau nol karena sangat sulit untuk membuat alat seperti itu. Oleh karena itu, penggunaan sign magnitude pada bilangan negatif tidak digunakan, akan tetapi diganti dengan metode 2′s complement. Metode 2′s complement adalah metode yang digunakan untuk merepresentasikan bilangan negatif pada komputer. Cara yang digunakan adalah dengan nilai terbesar dari biner dikurangin dengan nilai yang ingin dicari negatifnya.
Integer representation
Representasi dari Bilangan bulat
Kita perlu menggunakan representasi biner untuk setiap bagian dari data. Komputer beroperasi pada nilai-nilai biner (sebagai akibat dari yang dibangun dari transistor).
Ada 3 jenis data yang kita ingin mewakili:
- bilangan bulat
- karakter
- floating point nilai
Representasi Integer
Ada representasi biner yang berbeda untuk bilangan bulat. Kemungkinan kualitas:
- bilangan positif hanya
- bilangan positif dan negatif
- kemudahan pembacaan manusia
- kecepatan operasi komputer
Meskipun ada banyak representasi, dan semua telah digunakan di berbagai kali karena berbagai alasan, yang dikelilingi oleh * adalah representasi yang akan kita gunakan secara ekstensif.
- * Unsigned *
- tanda besarnya
- melengkapi satu
- * Melengkapi dua itu *
- bias (tidak dikenal)
- BCD (Binary Coded Decimal), digunakan terutama oleh aplikasi bisnis pada tahun 1960 dan 70-an.
Hampir semua komputer modern beroperasi berdasarkan representasi komplemen 2 ini. Mengapa?
- perangkat keras untuk melakukan operasi yang paling umum adalah lebih cepat (operasi yang paling umum adalah tambahan)
- hardware lebih sederhana (dan karena itu lebih cepat)
Apakah Anda perhatikan bahwa kedua alasan untuk menggunakan representasi komplemen 2 adalah sama? Hampir selalu, ketika membahas mengapa sesuatu dilakukan dengan cara itu dilakukan, jawabannya adalah sama: "karena lebih cepat."
aritmatika bilangan bulat
semua tentang aritmatika integer.
-------------------------------------
operasi kita akan mengenal (dan cinta):
tambahan
pengurangan
perkalian
divisi
operasi logis (tidak, dan, atau, nand, atau, xor, xnor)
perubahan
aturan untuk melakukan operasi aritmatika berbeda-beda
apa representasi tersirat.
SEDIKIT TENTANG PENAMBAHAN
----------------------
gambaran.
membawa dalam ab | sum melaksanakan
--------------- + ----------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
|
a 0011
+ B 0001
- -----
sum 0100
benar-benar seperti yang kita lakukan untuk desimal!
0 + 0 = 0
1 + 0 = 1
1 + 1 = 2 yaitu 10 dalam biner, sum adalah 0 dan membawa 1.
1 + 1 + 1 = 3 sum adalah 1, dan membawa 1.
PENAMBAHAN
--------
unsigned:
seperti penambahan sederhana yang diberikan.
contoh:
100001 00001010 (10)
011.101 00.001.110 (14)
------- ---------
111110 00011000 (24)
abaikan (membuang) melaksanakan dari MSB tersebut.
Mengapa? Karena komputer SELALU bekerja dengan presisi tetap.
menandatangani besarnya:
aturan:
- Menambahkan besaran saja (tidak membawa ke dalam bit tanda)
- Membuang apapun membawa keluar dari MSB dari besarnya
(Karena, sekali lagi, kendala presisi tetap.)
- Menambahkan hanya bilangan bulat seperti tanda (+ ke + atau - untuk -)
- Tanda hasil yang sama dengan tanda addends
contoh:
0 0101 (5) 1 1010 (-10)
+ 0 0011 (3) + 1 0011 (-3)
--------- ---------
0 1000 (8) 1 1101 (-13)
0 01011 (11)
+ 1 01110 (-14)
----------------
tidak menambahkan! harus melakukan pengurangan!
melengkapi seseorang:
dengan contoh
00111 (7) 111110 (-1) 11.110 (-1)
+ 00.101 (5) + 000.010 (2) + 11100 (-3)
----------- ------------ ------------
01.100 (12) 1 000000 (0) salah! 1 11010 (-5) salah!
+ 1 + 1
---------- ----------
000.001 (1) benar! 11.011 (-4) benar!
sehingga tampaknya bahwa jika ada yang membawa keluar (dari 1) dari MSB, kemudian
hasilnya akan dimatikan oleh 1, sehingga menambah 1 lagi untuk mendapatkan yang benar
Hasil. (Implementasi di HW disebut "berakhir sekitar carrry.")
melengkapi dua itu:
aturan:
- Hanya menambahkan semua bit
- Membuang apapun membawa dari MSB yang
- (Sama seperti untuk unsigned!)
contoh
00011 (3) 101000 111111 (-1)
+ 11100 (-4) + 010.000 + 001.000 (8)
------------ -------- --------
11111 (-1) 111.000 1 000.111 (7)
setelah melihat contoh untuk semua representasi ini, Anda mungkin melihat
mengapa 2 ini selain melengkapi membutuhkan hardware lebih sederhana dari
tanda mag. atau penambahan pelengkap seseorang.
Pengurangan
-----------
aturan umum:
1-1 = 0
0-0 = 0
1 - 0 = 1
10-1 = 1
0 - 1 = meminjam!
unsigned:
- Itu hanya masuk akal untuk mengurangi jumlah yang lebih kecil dari satu lebih besar
contoh
1011 (11) harus meminjam
- 0111 (7)
------------
0100 (4)
menandatangani besarnya:
- Jika tanda-tanda yang sama, kemudian melakukan pengurangan
- Jika tanda-tanda yang berbeda, kemudian mengubah masalah untuk penambahan
- Bandingkan besaran, kemudian kurangi lebih kecil dari yang lebih besar
- Jika order diaktifkan, kemudian beralih tanda juga.
- Ketika bilangan bulat adalah tanda yang berlawanan, kemudian melakukan
a - b menjadi + (-b)
a + b menjadi - (-b)
contoh
0 00111 (7) 1 11000 (-24)
- 0 11000 (24) - 1 00010 (-2)
-------------- --------------
1 10110 (-22)
melakukan 0 11000 (24)
- 0 00111 (7)
--------------
1 10001 (-17)
(Saklar tanda sejak urutan pengurangan terbalik)
melengkapi seseorang:
mencari tahu sendiri
melengkapi dua itu:
- Mengubah masalah penambahan!
a - b menjadi + (-b)
- Jadi, dapatkan terbalik aditif b, dan melakukan penambahan.
contoh
10110 (-10)
- 00011 (3) -> 00011
------------ |
\ | /
11100
+ 1
-------
11.101 (-3)
begitu juga
10110 (-10)
+ 11.101 (-3)
------------
1 10011 (-13)
(Membuang melaksanakan)
DETEKSI overflow TAMBAHAN
unsigned - ketika ada membawa keluar dari MSB yang
1000 (8)
1001 (9)
-----
1 0001 (1)
menandatangani besarnya - ketika ada membawa keluar dari MSB dari besarnya
1 1000 (-8)
+ 1 1001 (-9)
-----
1 0001 (-1) (melaksanakan dari MSB besarnya)
2 ini melengkapi - ketika tanda-tanda addends adalah sama, dan
tanda hasilnya berbeda
0011 (3)
+ 0110 (6)
----------
1001 (-7) (perhatikan bahwa jawaban yang benar akan menjadi 9, tapi
9 tidak dapat diwakili dalam melengkapi 4 bit 2 an)
detail - Anda tidak akan pernah mendapatkan meluap saat menambahkan 2 nomor dari
tanda-tanda yang berlawanan
DETEKSI MELIMPAH DI pengurangan
unsigned - pernah
tanda besarnya - tidak pernah terjadi ketika melakukan pengurangan
Komplemen 2 ini - kami tidak pernah melakukan pengurangan, jadi gunakan aturan tambahan
di samping operasi dilakukan.
PERKALIAN bilangan bulat
0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1
- Tulisan tangan, tampak seperti desimal
- Hasilnya dapat meminta 2x banyak bit sebagai multiplicand besar
- Untuk melengkapi 2, untuk selalu mendapatkan jawaban yang benar tanpa
berpikir tentang masalah ini, tanda memperpanjang kedua multiplicands ke
2x banyak bit (sebagai besar). Kemudian mengambil nomor yang benar
dari hasil bit dari bagian paling signifikan hasilnya.
2 komplemen contoh:
1111 1111 -1
x 1111 1001 x -7
---------------- ------
11111111 7
00000000
00000000
11111111
11111111
11111111
11111111
+ 11111111
----------------
1 00000000111
-------- (Jawaban yang benar digarisbawahi)
0011 (3) 0000 0011 (3)
x 1011 (-5) x 1.111 1011 (-5)
------ -----------
0011 00000011
0011 00000011
0000 00000000
+ 0011 00000011
--------- 00000011
0100001 00000011
tidak -15 dalam 00000011
representasi! + 00000011
------------------
1011110001
mengambil paling signifikan 8 bit 11110001 = -15
DIVISI bilangan bulat
unsigned saja!
contoh 15/3 1111/011
Untuk melakukan tulisan tangan ini, menggunakan algoritma yang sama seperti untuk bilangan bulat desimal.
OPERASI LOGIS
dilakukan bitwise
X = 0011
Y = 1.010
X DAN Y adalah 0010
X OR Y adalah 1011
X NOR Y adalah 0100
X XOR Y adalah 1001
dan lain-lain
OPERASI SHIFT
cara memindahkan bit sekitar dalam kata
3 jenis: logis, aritmatika dan rotate
(Masing-masing jenis dapat pergi kiri atau kanan)
kiri logis - memindahkan bit ke kiri, urutan yang sama
- Membuang bit yang muncul dari MSB yang
- Memperkenalkan 0 ke LSB
00110101
01101010 (logis kiri bergeser 1 bit)
hak logis - memindahkan bit ke kanan, urutan yang sama
- Membuang bit yang muncul dari LSB
- Memperkenalkan 0 ke MSB yang
00110101
00011010 (logis kanan bergeser 1 bit)
aritmatika kiri - bergerak bit ke kiri, urutan yang sama
- Membuang bit yang muncul dari MSB yang
- Memperkenalkan 0 ke LSB
- SAMA SHIFT KIRI SEBAGAI LOGIS!
hak aritmatika - memindahkan bit ke kanan, urutan yang sama
- Membuang bit yang muncul dari LSB
- Mereproduksi MSB asli ke MSB baru
- Cara lain untuk berpikir tentang hal ini: menggeser
bit, dan kemudian melakukan sign ekstensi
00110101 -> 00011010 (deret hitung kanan bergeser 1 bit)
1100 -> 1110 (deret hitung kanan bergeser 1 bit)
memutar kiri - memindahkan bit ke kiri, urutan yang sama
- Menempatkan bit yang muncul dari MSB ke LSB,
sehingga tidak ada bit yang dibuang atau hilang.
00110101 -> 01101010 (diputar ditinggalkan oleh 1 tempat)
1100 -> 1001 (diputar ditinggalkan oleh 1 tempat)
memutar kanan - memindahkan bit ke kanan, urutan yang sama
- Menempatkan bit yang muncul dari LSB ke MSB tersebut,
sehingga tidak ada bit yang dibuang atau hilang.
00110101 -> 10011010 (diputar benar dengan 1 tempat)
1100 -> 0110 (diputar benar dengan 1 tempat)
PETUNJUK UNTUK OPERASI SASM LOGIS DAN SHIFT
SASM memiliki instruksi yang melakukan bitwise operasi logis dan
pergeseran operasi.
lnot xx <- TIDAK (x)
tanah x, yx <- (x) DAN (y)
lor x, yx <- (x) ATAU (y)
lxor x, yx <- (x) XOR (y)
llsh xx <- (x), logis kiri digeser oleh 1 bit
rlsh xx <- (x), secara logis benar digeser oleh 1 bit
ruam xx <- (x), deret hitung kanan digeser oleh 1 bit
rror xx <- (x), diputar tepat oleh 1 bit
Floating point
Dari Wikipedia, ensiklopedia bebas
Sebuah komputer yang diprogram elektromekanis awal, Z3 , termasuk aritmatika floating-point (replika dipajang di Museum Deutsches di Munich ).
Dalam komputasi , floating point adalah representasi dari perkiraan dari bilangan realdengan cara yang dapat mendukung trade-off antara jangkauan dan presisi . Sejumlah adalah, secara umum, mewakili sekitar untuk tetap jumlah digit yang signifikan (yangsignificand ) dan skala menggunakan eksponen ; dasar untuk scaling biasanya dua, sepuluh, atau enam belas. Sejumlah yang dapat diwakili tepat adalah dalam bentuk berikut:

Sebagai contoh:

Titik Istilah floating mengacu pada fakta bahwa sejumlah itu titik radix (titik desimal,atau, komputer lebih sering pada, titik biner) dapat "mengambang"; yaitu, dapat ditempatkan di manapun relatif terhadap angka signifikan dari nomor tersebut. Posisi ini diindikasikan sebagai komponen eksponen, dan dengan demikian representasi floating-point dapat dianggap sebagai semacam notasi ilmiah .
Representasi floating-point tersebut mungkin dapat mewakili nomor yang memiliki magnitude besar (misalnya, jarak antar galaksi dalam hal kilometer ), tetapi tidak untuk ketepatan nomor yang mempunyai besar yang sangat kecil (misalnya, jarak pada skalaFemtometer ); sebaliknya, representasi floating-point tersebut mungkin dapat mewakili besarnya sangat kecil, tapi tidak secara bersamaan berkekuatan sangat besar. Hasil rentang dinamis ini adalah bahwa angka-angka yang dapat diwakili tidak seragam spasi; perbedaan antara dua angka representable berturut-turut tumbuh dengan skala yang dipilih.[1]
Selama bertahun-tahun, berbagai floating-point representasi telah digunakan dalam komputer. Namun, sejak tahun 1990-an, representasi paling sering ditemui adalah bahwa didefinisikan oleh IEEE 754 standar.
Kecepatan operasi floating-point, biasanya diukur dalam hal FLOPS , merupakan ciri penting dari sebuah sistem komputer, terutama untuk aplikasi yang melibatkan intensif perhitungan matematis.
Isi
- 1 Ikhtisar
- 2 Rentang angka floating-point
- 3 IEEE 754: floating point dalam komputer modern
- 4 nomor Representable, konversi dan pembulatan
- 5 Floating-point operasi aritmatika
- 6 Berurusan dengan kasus luar biasa
- 7 masalah Akurasi
- 8 Lihat juga
- 9 Catatan dan referensi
- 10 Bacaan lebih lanjut
- 11 Pranala luar
Sekilas
Angka floating-point
Sebuah representasi angka (disebut sistem angka dalam matematika) menetapkan beberapa cara pengkodean angka, biasanya sebagai string digit.
Ada beberapa mekanisme yang string dari digit dapat mewakili angka. Dalam notasi matematika umum, string digit dapat dari setiap panjang, dan lokasi titik radix ditunjukkan dengan menempatkan eksplisit "titik" karakter (dot atau koma) di sana. Jika titik radix tidak ditentukan, maka secara implisit diasumsikan terletak pada sebelah kanan (di paling signifikan) akhir string (yaitu, jumlah ini merupakan bilangan bulat ). Dalam fixed-pointsistem, beberapa asumsi tertentu dibuat tentang di mana titik radix terletak dalam string; misalnya, konvensi bisa jadi bahwa string terdiri dari 8 digit desimal dengan titik desimal di tengah, sehingga "00012345" merupakan nilai 1,2345.
Dalam notasi ilmiah , angka yang diberikan adalah skala oleh kekuatan 10 , sehingga terletak dalam kisaran tertentu-biasanya antara 1 dan 10, dengan titik radix muncul segera setelah angka pertama. Faktor skala, sebagai kekuatan sepuluh, kemudian ditunjukkan secara terpisah pada akhir nomor. Misalnya, periode revolusi Jupiter bulan 's Io adalah 152853.5047 detik, nilai yang akan direpresentasikan dalam notasi ilmiah standar-bentuk sebagai 1,528535047 × 10 5 detik.
Floating-point representasi mirip dalam konsep ke notasi ilmiah. Logikanya, angka floating-point terdiri dari:
- A ditandatangani (yang berarti negatif atau non-negatif) string digit dari panjang yang diberikan dalam diberikan dasar (atau radix ). String ini digit disebut sebagai significand (atau sebagai koefisien , atau sebagai mantissa, yang tidak disarankan). Panjang significand menentukan presisi yang nomor dapat diwakili. Posisi titik radix diasumsikan selalu berada di suatu tempat dalam significand-sering hanya setelah atau sebelum digit yang paling signifikan, atau di sebelah kanan paling kanan (paling signifikan) digit. Artikel ini umumnya mengikuti konvensi bahwa titik radix diatur hanya setelah yang paling signifikan (paling kiri) digit.
Kata "mantissa" sering digunakan sebagai sinonim untuk "significand". Penggunaan "mantissa" di tempat "significand" atau "koefisien" tidak disarankan, sebagai "mantissa" secara tradisional didefinisikan sebagai bagian pecahan dari logaritma, sedangkan "karakteristik" adalah bagian integer. Terminologi ini berasal dari cara di mana logaritma tabel digunakan sebelum komputer menjadi biasa; log tabel sebenarnya tabel Mantisa.
- Sebuah integer ditandatangani eksponen (juga disebut sebagai karakteristik,atau skala), yang memodifikasi besarnya nomor tersebut.
Untuk memperoleh nilai angka floating-point, significand dikalikan dengan dasar pangkat dari eksponen, setara dengan menggeser titik radix dari posisi tersirat oleh sejumlah tempat sama dengan nilai dari eksponen-to kanan jika eksponen positif atau ke kiri jika eksponen negatif.
Menggunakan basis-10 (akrab desimal notasi) sebagai contoh, jumlah 152.853,5047, yang memiliki sepuluh digit desimal presisi, diwakili sebagai significand 1528535047 bersama dengan 5 sebagai eksponen. Untuk menentukan nilai yang sebenarnya, titik desimal ditempatkan setelah angka pertama significand dan hasilnya dikalikan dengan 10 5untuk memberikan 1,528535047 × 10 5, atau 152853,5047. Dalam menyimpan nomor tersebut, basis (10) tidak perlu disimpan, karena akan sama untuk seluruh kisaran angka yang didukung, dan dengan demikian dapat disimpulkan.
Secara simbolis, nilai akhir ini adalah:

dimana
adalah significand (mengabaikan semua titik desimal tersirat),
adalah presisi (jumlah digit di significand yang),
adalah basis (dalam contoh kita, ini adalah nomorsepuluh), dan
adalah eksponen.




Secara historis, beberapa basis nomor telah digunakan untuk mewakili angka floating-point, dengan basis dua ( biner ) yang paling umum, diikuti oleh basis sepuluh (desimal), dan varietas lainnya kurang umum, seperti enam belas dasar ( notasi heksadesimal ), dan bahkan basis tiga (lihat Setun ).
Sebuah angka floating-point adalah bilangan rasional , karena dapat direpresentasikan sebagai salah satu bilangan bulat dibagi dengan yang lain; misalnya 1,45 × 10 3 adalah (145/100) * 1000 atau 145000/100. Dasar menentukan fraksi yang dapat diwakili; misalnya, 1/5 tidak dapat diwakili tepat sebagai angka floating-point menggunakan basis biner, tetapi 05/01 dapat diwakili tepat menggunakan basis desimal (0,2, atau 2 × 10 -1).Namun, 1/3 tidak dapat diwakili persis dengan baik biner (0,010101 ...) atau desimal (0,333 ....), tetapi dalam basis 3 , itu adalah sepele (0,1 atau 1 × 3 -1). Kesempatan di mana ekspansi tak terbatas terjadi tergantung pada dasar dan yang faktor utama , seperti yang dijelaskan dalam artikel di Posisi Notasi .
Cara di mana significand (termasuk tanda) dan eksponen disimpan dalam komputer adalah tergantung dari implementasi. Format IEEE umum dijelaskan secara rinci nanti dan di tempat lain, tetapi sebagai contoh, dalam biner presisi tunggal (32-bit) representasi floating-point,
, Dan significand adalah string dari 24 bit . Misalnya, jumlah π 's pertama 33 bit adalah:


Jika bit paling kiri dianggap 1 bit, maka bit-24 adalah nol dan bit 25 adalah 1; dengan demikian, dalam pembulatan ke 24 bit, mari kita hubungkan dengan bit-24 nilai 25, menghasilkan:

Ketika ini disimpan menggunakan IEEE 754 encoding, ini menjadi significand yang
dengan
(Di mana
diasumsikan memiliki titik biner di sebelah kanan bit pertama) setelah kiri-penyesuaian (atau normalisasi) selama nol terkemuka atau tertinggal yang terpotong apabila ada, yang tidak perlu dalam hal ini; sebagai hasil dari normalisasi ini, bit pertama dari non-nol significand biner selalu 1, sehingga tidak perlu disimpan, menyimpan satu bit penyimpanan. Dengan kata lain, dari representasi ini, π dihitung sebagai berikut:




dimana
adalah significand dinormalisasi itu n th bit dari kiri, di mana penghitungan dimulai dengan 1. Normalisasi, yang terbalik dengan penambahan satu implisit, dapat dianggap sebagai bentuk kompresi; itu memungkinkan significand biner dapat dikompresi menjadi bidang sedikit lebih pendek dari presisi maksimum, dengan mengorbankan pemrosesan tambahan.

Alternatif untuk angka floating-point
Representasi floating-point adalah jauh cara yang paling umum mewakili dalam komputer pendekatan untuk bilangan real. Namun, ada alternatif:
- Fixed-point representasi menggunakan bilangan bulat operasi hardware dikendalikan oleh implementasi software dari konvensi tertentu tentang lokasi titik biner atau desimal, misalnya, 6 bit atau digit dari kanan. Perangkat keras untuk memanipulasi representasi ini lebih murah dibandingkan floating point, dan dapat digunakan untuk melakukan operasi bilangan bulat normal, juga. Titik tetap biner biasanya digunakan dalam aplikasi tujuan khusus pada prosesor tertanam yang hanya dapat melakukan aritmatika integer, tetapi intinya tetap desimal adalah umum dalam aplikasi komersial.
- Kode-biner desimal (BCD) adalah pengkodean untuk angka desimal di mana setiap digit diwakili oleh urutan biner sendiri. Hal ini dimungkinkan untuk menerapkan sistem floating-point dengan BCD encoding.
- Sistem bilangan logaritmik merupakan bilangan real dengan logaritma dari nilai mutlak dan sedikit tanda. Distribusi nilai adalah sama floating point, tetapi kurva nilai-to-representasi (yaitu, grafik fungsi logaritma) halus (kecuali pada 0). Sebaliknya untuk aritmatika floating-point, di logaritmik sistem bilangan perkalian, pembagian dan eksponensial sederhana untuk diterapkan, tetapi penambahan dan pengurangan yang kompleks. The indeks tingkat aritmatikadari Clenshaw, Olver, dan Turner adalah skema didasarkan pada representasi logaritma umum.
- Dimana lebih presisi yang diinginkan, aritmatika floating-point dapat diimplementasikan (biasanya dalam perangkat lunak) dengan variabel-panjang significands (dan kadang-kadang eksponen) yang berukuran tergantung pada kebutuhan aktual dan tergantung pada bagaimana hasil perhitungan. Ini disebutsewenang-wenang-presisi floating-point aritmatika.
- Beberapa nomor (misalnya, 1/3 dan 10/01) tidak dapat diwakili tepat dalam biner floating-point, tidak peduli apa presisi adalah. Paket perangkat lunak yang melakukan aritmatika rasional mewakili angka sebagai pecahan dengan pembilang dan penyebut terpisahkan, dan karena itu dapat mewakili nomor rasional tepat. Paket tersebut umumnya perlu menggunakan " bignum "aritmatika untuk bilangan bulat masing-masing.
- Sistem aljabar komputer seperti Mathematica dan Maxima sering dapat menangani bilangan irasional seperti
atau
dalam benar-benar "resmi" cara, tanpa berurusan dengan pengkodean tertentu significand tersebut. Program tersebut dapat mengevaluasi ekspresi seperti "
"Persis, karena itu diprogram untuk memproses matematika yang mendasari langsung, daripada menggunakan nilai perkiraan untuk setiap perhitungan menengah.
Sejarah
Leonardo Torres y Quevedo . Pada tahun 1914, ia menerbitkan sebuah analisis dari angka floating-point.
Pada tahun 1914, Leonardo Torres y Quevedo dirancang versi elektro-mekanik Charles Babbage 's Analytical Mesin , dan termasuk aritmatika floating-point. [2] Pada tahun 1938,Konrad Zuse Berlin menyelesaikan Z1 , binari pertama, komputer mekanik diprogram; [3]menggunakan representasi bilangan biner floating-point 24-bit dengan 7-bit ditandatangani eksponen, sebuah significand 16-bit (termasuk satu bit implisit), dan sedikit tanda. Semakin handal estafet berbasis Z3 , selesai pada tahun 1941, memiliki representasi bagi terhingga positif dan negatif; khususnya, menerapkan operasi didefinisikan dengan infinity, seperti
, Dan berhenti pada operasi terdefinisi, seperti
.


Konrad Zuse , arsitek dari Z3 komputer, yang menggunakan representasi floating-point biner 22-bit.
Zuse juga mengusulkan, tapi tidak selesai, hati-hati bulat aritmatika floating-point yang mencakup
dan NaN representasi, mengantisipasi fitur Standar IEEE oleh empat dekade. [ 4 ] Sebaliknya, von Neumann direkomendasikan terhadap angka floating-point untuk 1.951 mesin IAS , dengan alasan bahwa fixed-point aritmatika adalah lebih baik. [ 5 ]

Pertama komersial komputer dengan floating-point hardware adalah Zuse Z4 komputer, yang dirancang pada tahun 1942-1945. Pada tahun 1946, Bell Laboratories memperkenalkan Mark V, yang mengimplementasikan angka floating-point desimal . [ 6 ]
The Percontohan ACE memiliki biner floating-point aritmatika, dan mulai beroperasi pada 1950 di National Physical Laboratory, Inggris . Sebanyak 33 kemudian dijual secara komersial sebagai English listrik Deuce . Aritmatika tersebut benar-benar diterapkan dalam perangkat lunak, tetapi dengan clock rate satu megahertz, kecepatan floating-point dan fixed-point operasi di mesin ini awalnya lebih cepat daripada banyak komputer bersaing.
Diproduksi secara massal IBM 704 diikuti pada tahun 1954; memperkenalkan penggunaan eksponen bias . Untuk beberapa dekade setelah itu, floating-point hardware itu biasanya merupakan fitur opsional, dan komputer yang memiliki itu dikatakan "komputer ilmiah", atau memiliki "komputasi ilmiah" kemampuan. Tidak sampai peluncuran i486 Intel pada tahun 1989 yang tujuan umum komputer pribadi memiliki kemampuan floating-point di hardware sebagai fitur standar.
The UNIVAC 1100/2200 series , diperkenalkan pada tahun 1962, mendukung dua representasi floating-point:
- Presisi tunggal : 36 bit, yang diselenggarakan sebagai tanda 1-bit, 8-bit eksponen, dan significand 27-bit.
- Presisi ganda : 72 bit, yang diselenggarakan sebagai tanda 1-bit, 11-bit eksponen, dan significand 60-bit.
The IBM 7094 , juga diperkenalkan pada 1962, mendukung presisi tunggal dan presisi ganda representasi, tetapi dengan tidak ada hubungannya dengan representasi UNIVAC itu. Memang, pada tahun 1964, IBM memperkenalkan proprietary representasi floating-point dalam Surat System / 360 mainframe; ini representasi yang sama masih tersedia untuk digunakan dalam yang modern z / Arsitektur sistem. Namun, pada tahun 1998, IBM termasuk IEEE-kompatibel biner floating-point aritmatika untuk mainframe-nya; pada tahun 2005, IBM juga menambahkan IEEE-kompatibel desimal aritmatika floating-point.
Awalnya, komputer digunakan banyak representasi yang berbeda untuk angka floating-point. Kurangnya standarisasi di tingkat mainframe adalah masalah yang sedang berlangsung oleh awal 1970-an bagi mereka menulis dan memelihara kode sumber-tingkat yang lebih tinggi; produsen standar tersebut floating-point berbeda dalam ukuran kata, representasi, dan perilaku pembulatan dan akurasi umum operasi. Floating-point kompatibilitas di beberapa sistem komputasi sangat membutuhkan standardisasi pada awal 1980-an, yang mengarah ke penciptaan IEEE-754 standar setelah 32-bit (atau 64-bit)kata telah menjadi hal yang biasa. Standar ini secara signifikan berdasarkan proposal dari Intel, yang merancang i8087 coprocessor numerik; Motorola, yang merancang 68000sekitar waktu yang sama, memberikan masukan yang signifikan juga.
Pada tahun 1989, ahli matematika dan komputer ilmuwan Prof. William Kahan dihormati dengan Turing Award untuk menjadi arsitek utama di balik proposal ini; ia dibantu oleh muridnya (Jerome Coonen) dan profesor tamu (Harold Stone). [ 7 ]
Di antara inovasi x86 adalah:
- Sebuah representasi floating-point tepatnya ditentukan pada tingkat bit-string, sehingga semua komputer compliant menafsirkan pola bit dengan cara yang sama. Hal ini memungkinkan untuk mentransfer nomor floating-point dari satu komputer ke komputer lain (setelah memperhitungkan endianness ).
- Sebuah perilaku justru ditentukan untuk operasi aritmatika: hasil A diperlukan untuk diproduksi seolah-olah jauh tepat aritmatika digunakan untuk menghasilkan nilai yang kemudian dibulatkan menurut aturan tertentu. Ini berarti bahwa program komputer compliant akan selalu menghasilkan hasil yang sama ketika diberi masukan tertentu, sehingga mengurangi reputasi hampir mistik yang floating-point telah dikembangkan untuk sampai saat nya perilaku yang tampaknya non-deterministik.
- Kemampuan kondisi luar biasa (overflow, membagi dengan nol, dll) untuk menyebarkan melalui suatu perhitungan dengan cara jinak dan kemudian akan ditangani oleh perangkat lunak secara terkendali.
Kisaran angka floating-point
Sebuah angka floating-point terdiri dari dua fixed-point komponen, yang rentang tergantung secara eksklusif pada jumlah bit atau digit dalam representasi mereka. Sedangkan komponen linear tergantung pada jangkauan mereka, floating-point linear range tergantung pada kisaran yang signifikan dan secara eksponensial pada kisaran komponen eksponen, yang menempel jangkauan luar biasa luas untuk nomor tersebut.
Pada sistem komputer biasa, sebuah 'presisi ganda' (64-bit) bilangan biner floating-point memiliki koefisien dari 53 bit (satu dari yang tersirat), eksponen 11 bit, dan satu tanda sedikit. Angka floating-point positif dalam format ini memiliki berbagai perkiraan 10 -308sampai 10 308 , karena berbagai eksponen adalah [-1022,1023] dan 308 adalah sekitar log 10 (2 1023 ). Kisaran lengkap format adalah dari sekitar -10 308 melalui +10 308 (lihatIEEE 754 ).
Jumlah angka floating-point normal dalam sistem F ( B , P , L , U ) (di mana B adalah basis dari sistem, P adalah ketepatan sistem untuk P nomor, L adalah eksponen representable terkecil di sistem, dan U adalah eksponen terbesar digunakan dalam sistem) adalah:
.

Ada positif dinormalisasi nomor terkecil floating-point, tingkat Underflow = UFL =
yang memiliki 1 sebagai digit terkemuka dan 0 untuk digit yang tersisa dari significand, dan mungkin nilai terkecil untuk eksponen.

Ada sejumlah terbesar floating-point, tingkat Overflow = OFL =
yang memiliki B - 1 sebagai nilai untuk setiap digit dari significand dan mungkin nilai terbesar untuk eksponen.

Selain itu ada nilai-nilai representable ketat antara -UFL dan UFL. Yakni, angka nol positif dan negatif , serta nomor denormalized .
IEEE 754: floating point di komputer modern
Artikel utama: IEEE floating point
Lain
|
The IEEE memiliki standar representasi komputer untuk angka floating-point biner dalamIEEE 754 (aka. IEC 60559). Standar ini diikuti oleh hampir semua mesin modern. Mainframe IBM mendukung sendiri format titik heksadesimal floating IBM dan IEEE 754-2008 desimal floating point selain IEEE 754 format biner. The Cray T90 seri memiliki versi IEEE, tapi SV1 masih menggunakan Cray Format floating-point.
Standar ini memberikan banyak format terkait erat, berbeda hanya dalam beberapa detail. Lima dari format ini disebut format dasar dan lain-lain yang disebut format diperpanjang; tiga ini terutama banyak digunakan dalam perangkat keras komputer dan bahasa:
- Presisi tunggal , biasanya digunakan untuk mewakili tipe "mengambang" dalam rumpun bahasa C (meskipun ini tidak dijamin ). Ini adalah format biner yang menempati 32 bit (4 byte) dan significand yang memiliki presisi dari 24 bit (digit sekitar 7 desimal).
- Presisi ganda , biasanya digunakan untuk mewakili tipe "ganda" dalam rumpun bahasa C (meskipun ini tidak dijamin ). Ini adalah format biner yang menempati 64 bit (8 byte) dan significand yang memiliki presisi dari 53 bit (sekitar 16 digit desimal).
- Ganda diperpanjang , juga disebut "presisi diperpanjang" format. Ini adalah format biner yang menempati setidaknya 79 bit (80 jika tersembunyi / implisit bit aturan tidak digunakan) dan significand yang memiliki ketepatan minimal 64 bit (sekitar 19 digit desimal). Sebuah format memenuhi persyaratan minimal (64-bit presisi, 15-bit eksponen, sehingga pas pada 80 bit) disediakan oleh arsitektur x86 . Secara umum pada prosesor tersebut, format ini dapat digunakan dengan " ganda panjang "dalam rumpun bahasa C ( C99 dan C11 standar "IEC 60559 aritmatika floating-point Annex extension- F" merekomendasikan 80-bit format diperpanjang untuk diberikan sebagai "long double" bila tersedia). Pada prosesor lainnya, "panjang ganda" mungkin sinonim untuk "ganda" jika bentuk presisi diperpanjang tidak tersedia, atau mungkin berdiri untuk format yang lebih besar, seperti presisi quadruple.
Peningkatan ketepatan representasi floating point umumnya mengurangi jumlah akumulasiround-off error yang disebabkan oleh perhitungan menengah. [ 8 ]
Kurang format IEEE umum termasuk:
- Presisi quadruple (binary128). Ini adalah format biner yang menempati 128 bit (16 byte) dan significand yang memiliki presisi 113 bit (sekitar 34 digit desimal).
- Presisi ganda (decimal64) dan presisi quadruple (decimal128) desimal format floating-point. Format ini, bersama dengan presisi tunggal (decimal32) format, dimaksudkan untuk melakukan desimal pembulatan dengan benar.
- Setengah , juga disebut binary16, nilai floating-point 16-bit.
Setiap bilangan bulat dengan nilai absolut kurang dari 2 24 dapat tepat diwakili dalam format presisi tunggal, dan setiap bilangan bulat dengan nilai absolut kurang dari 2 53 dapat tepat diwakili dalam format presisi ganda. Selain itu, berbagai kekuatan dari 2 kali seperti nomor dapat diwakili. Properti ini kadang-kadang digunakan untuk data murni integer, untuk mendapatkan 53-bit bilangan bulat pada platform yang memiliki mengapung presisi ganda tetapi hanya 32-bit bilangan bulat.
Standar ini menetapkan beberapa nilai khusus, dan perwakilan mereka: positif infinity (+ ∞), infinity negatif (-∞), sebuah nol negatif (-0) berbeda dari biasa ("positif") nol, dan "bukan angka" nilai-nilai ( NaN ).
Perbandingan angka floating-point, seperti yang didefinisikan oleh standar IEEE, agak berbeda dari biasanya perbandingan integer. Negatif dan positif nol membandingkan sama, dan setiap NaN membandingkan tidak sama untuk setiap nilai, termasuk dirinya sendiri. Semua nilai kecuali NaN secara ketat lebih kecil dari + ∞ dan ketat lebih besar dari -∞. Angka floating-point yang terbatas yang diperintahkan dalam cara yang sama seperti nilai-nilai mereka (dalam himpunan bilangan real).
Sebuah proyek untuk merevisi standar IEEE 754 dimulai pada tahun 2000 (lihat IEEE 754 revisi ); itu diselesaikan dan disetujui pada bulan Juni 2008. Ini mencakup desimal format floating-point dan 16-bit format floating-point ("binary16"). binary16 memiliki struktur yang sama dan aturan sebagai format yang lebih tua, dengan 1 tanda bit, 5 bit eksponen dan 10 bit significand tertinggal. Hal ini sedang digunakan dalam NVIDIA Cg bahasa grafis, dan dalam standar OpenEXR. [ 9 ]
Representasi internal
Angka floating-point biasanya dikemas ke dalam datum komputer sebagai bit tanda, bidang eksponen, dan significand (atau "mantissa", sebuah istilah putus asa), dari kiri ke kanan. Untuk IEEE 754 format biner (dasar dan tambahan) yang memiliki implementasi perangkat keras yang masih ada, mereka dibagi sebagai berikut:
Jenis
|
Tanda
|
Eksponen
|
Lapangan significand
|
Jumlah bit
|
Bias eksponen
|
Presisi bit
|
Jumlah digit desimal
| |
1
|
5
|
10
|
16
|
15
|
11
|
~ 3.3
| ||
1
|
8
|
23
|
32
|
127
|
24
|
~ 7.2
| ||
1
|
11
|
52
|
64
|
1023
|
53
|
~ 15,9
| ||
1
|
15
|
64
|
80
|
16.383
|
64
|
~ 19.2
| ||
1
|
15
|
112
|
128
|
16.383
|
113
|
~ 34,0
|
Sementara eksponen bisa positif atau negatif, dalam format biner disimpan sebagai nomor unsigned yang memiliki tetap "Bias" ditambahkan ke dalamnya. Nilai dari semua 0s di bidang ini disediakan untuk nol dan nomor di bawah normal ; nilai semua 1s disediakan untuk infinities dan NaN. Rentang eksponen untuk nomor dinormalisasi adalah [-126, 127] untuk presisi tunggal, [-1022, 1023] untuk ganda, atau [-16.382, 16.383] untuk quad. Nomor Normalisasi mengecualikan nilai subnormal, nol, tak terbatas itu, dan NaN.
Dalam format interchange biner IEEE terkemuka 1 sedikit significand dinormalisasi tidak sebenarnya disimpan dalam datum komputer. Hal ini disebut "tersembunyi" atau "implisit" bit. Karena itu, format yang presisi tunggal sebenarnya memiliki significand dengan 24 bit presisi, format yang presisi ganda memiliki 53, dan quad memiliki 113.
Sebagai contoh, ditunjukkan di atas π itu, dibulatkan menjadi 24 bit presisi, memiliki:
- tanda = 0; e = 1; s = 110010010000111111011011 (termasuk bit tersembunyi)
Jumlah bias eksponen (127) dan eksponen (1) adalah 128, jadi ini diwakili dalam format presisi tunggal sebagai
- 0 10000000 10010010000111111011011 (tidak termasuk bit tersembunyi) = 40490FDB [ 10 ] sebagai heksadesimal nomor.
Piecewise linear pendekatan untuk eksponensial dan logaritma
Bilangan bulat ditafsirkan sebagai angka floating point (warna biru, piecewise linear), dibandingkan dengan logaritma skala dan bergeser (abu-abu, halus).
Jika salah satu grafik nilai floating point dari pola bit ( x sumbu adalah pola bit, dianggap sebagai bilangan bulat, y sumbu nilai angka floating point; menganggap positif), diperoleh perkiraan piecewise linear dari bergeser dan bersisik eksponensial berfungsi dengan basis 2,
(maka sebenarnya
).Sebaliknya, diberi nomor nyata, jika seseorang mengambil representasi floating point dan menganggap itu sebagai integer, satu mendapatkan perkiraan piecewise linear dari bergeser dan bersisik basis 2 logaritma,
(maka sebenarnya
), seperti yang ditunjukkan di sebelah kanan.




Interpretasi ini berguna untuk memvisualisasikan bagaimana nilai-nilai angka floating point bervariasi dengan representasi, dan memungkinkan untuk perkiraan efisien tertentu operasi floating point oleh operasi bilangan bulat dan pergeseran bit. Misalnya, reinterpreting pelampung sebagai integer, mengambil negatif (atau lebih tepatnya mengurangi dari nomor tetap, karena bias dan implisit 1), kemudian menafsirkan ulang sebagai pelampung menghasilkan timbal balik tersebut. Secara eksplisit, mengabaikan significand, mengambil timbal balik ini hanya mengambil kebalikan aditif dari (berisi) eksponen, karena eksponen timbal balik adalah negatif eksponen asli. (. Oleh karena itu benar-benar mengurangi eksponen dari dua kali bias, yang sesuai dengan unbiasing, mengambil negatif, dan kemudian biasing) Untuk significand, dekat 1 timbal balik adalah sekitar linier:
(karena derivatif adalah
;ini adalah istilah pertama dari deret Taylor ), dan dengan demikian untuk significand juga, mengambil negatif (atau lebih tepatnya mengurangi dari sejumlah tetap untuk menangani implisit 1) adalah sekitar mengambil timbal balik tersebut.


Lebih penting lagi, bit pergeseran memungkinkan seseorang untuk menghitung persegi (bergeser ke kiri oleh 1) atau mengambil akar kuadrat (bergeser ke kanan oleh 1). Hal ini menyebabkan perhitungan perkiraan akar kuadrat ; dikombinasikan dengan teknik sebelumnya untuk mengambil pembalikan, hal ini memungkinkan terbalik cepat akar kuadrat perhitungan, yang penting dalam pengolahan grafis di akhir 1980-an dan 1990-an. Hal ini dapat dimanfaatkan dalam beberapa aplikasi lain, seperti ramping volume pengolahan suara digital. [ klarifikasi diperlukan ]
Konkretnya, setiap kali kenaikan eksponen, nilai ganda (maka tumbuh secara eksponensial), sedangkan setiap kali kelipatannya significand (untuk eksponen diberikan), nilai meningkat
(maka tumbuh secara linear, dengan kemiringan sama dengan yang sebenarnya berisi) nilai (dari eksponen). Hal ini berlaku bahkan untuk langkah terakhir dari eksponen diberikan, di mana significand meluap ke eksponen: dengan implisit 1, nomor setelah 1.11 ... 1 adalah 2,0 (terlepas dari eksponen), yaitu kenaikan dari eksponen:

(0 ... 001) 0 ... 0 sampai dengan (0 ... 001) 1 ... 1, (0 ... 010) 0 ... 0 adalah langkah-langkah yang sama (linear)
Jadi sebagai grafik itu adalah potongan linear (seperti significand tumbuh untuk eksponen diberikan) yang menghubungkan kekuatan merata spasi dua (ketika significand adalah 0), dengan masing-masing bagian linier memiliki dua kali kemiringan sebelumnya: itu kira-kira skala dan bergeser eksponensial
.Setiap bagian mengambil ruang horisontal yang sama, tapi dua kali ruang vertikal yang terakhir. Karena eksponen cembung ke atas, nilainya selalu lebih besar dari atau sama dengan yang sebenarnya (bergeser dan bersisik) kurva eksponensial melalui titik-titik dengan significand 0; oleh pergeseran sedikit berbeda satu dapat lebih dekat mendekati sebuah eksponensial, kadang-kadang melebih-lebihkan, kadang-kadang meremehkan. Sebaliknya, menafsirkan nomor floating point sebagai integer memberikan perkiraan bergeser dan bersisik logaritma, dengan masing-masing bagian memiliki setengah kemiringan yang terakhir, mengambil ruang vertikal yang sama tapi dua kali ruang horisontal. Karena logaritma yang cembung ke bawah, pendekatan yang selalukurang dari kurva logaritmik yang sesuai; lagi, pilihan yang berbeda skala dan pergeseran (seperti pada kanan atas) menghasilkan pendekatan lebih dekat.

Nilai-nilai khusus
Ditandatangani nol
Artikel utama: Ditandatangani nol
Dalam 754 standar IEEE, nol ditandatangani, yang berarti bahwa terdapat baik "nol positif" (+0) dan "nol negatif" (-0). Dalam kebanyakan lingkungan run-time , nol positif biasanya dicetak sebagai "0", sementara nol negatif dapat dicetak sebagai "-0". Dua nilai berperilaku sama dalam perbandingan numerik, tetapi beberapa operasi kembali hasil yang berbeda untuk +0 dan -0. Misalnya, 1 / (- 0) mengembalikan infinity negatif, sementara 1 / + 0 kembali infinity positif (sehingga identitas 1 / (1 / ± ∞) = ± ∞ dipertahankan). Umum lainnya fungsi dengan diskontinuitas pada x = 0 yang mungkin memperlakukan +0 dan -0 berbeda termasuk log (x), signum (x), dan akar kuadrat utama dari y + xi untuk setiap angka negatif y. Seperti halnya skema pendekatan, operasi yang melibatkan "nol negatif" kadang-kadang dapat menyebabkan kebingungan. Sebagai contoh, di IEEE 754, x = y tidak berarti 1 / x = 1 / y , sebagai 0 = -0 tapi 1/0 ≠ 1 / -0 . [ 11 ]
Nomor di bawah normal
Artikel utama: nomor subnormal
Nilai-nilai di bawah normal mengisi underflow kesenjangan dengan nilai-nilai di mana jarak absolut antara mereka adalah sama seperti nilai-nilai yang berdekatan di luar dari celah underflow. Ini merupakan perbaikan atas praktek yang lebih tua untuk hanya memiliki nol di celah underflow, dan di mana hasil underflowing digantikan dengan nol (siram ke nol).
Floating-point hardware modern biasanya menangani nilai-nilai di bawah normal (serta nilai normal), dan tidak memerlukan emulasi perangkat lunak untuk subnormals.
Terhingga
Untuk rincian lebih lanjut tentang konsep yang tak terbatas, lihat Infinity .
Yang tak terbatas itu yang diperpanjang garis bilangan real dapat direpresentasikan dalam IEEE tipe data floating-point, seperti nilai-nilai biasa floating-point seperti 1, 1.5, dll Mereka tidak nilai kesalahan dengan cara apapun, meskipun mereka sering (tapi tidak selalu, karena tergantung pada pembulatan) digunakan sebagai nilai pengganti bila adamelimpah . Setelah membagi-dengan-nol pengecualian, infinity positif atau negatif dikembalikan sebagai hasil yang tepat. Sebuah infinity juga dapat diperkenalkan sebagai angka (seperti C "INFINITY" makro, atau "∞" jika bahasa pemrograman memungkinkan bahwa sintaks).
IEEE 754 membutuhkan terhingga untuk ditangani dengan cara yang wajar, seperti
- (+ ∞) + (+7) = (+ ∞)
- (+ ∞) × (-2) = (-∞)
- (+ ∞) × 0 = NaN - tidak ada hal berarti yang dapat dilakukan
NaN
Artikel utama: NaN
IEEE 754 menetapkan nilai khusus yang disebut "Not a Number" (NaN) untuk dikembalikan sebagai hasil dari tertentu "tidak sah" operasi, seperti 0/0, ∞ × 0, atau sqrt (-1). Secara umum, NaN akan disebarkan yaitu sebagian besar operasi melibatkan NaN akan menghasilkan NaN, meskipun fungsi yang akan memberikan beberapa hasil yang ditetapkan untuk setiap sistem nilai floating-point akan melakukannya untuk NaN juga, misalnya NaN ^ 0 = 1. Ada dua jenis NaN: default tenang NaN dan, opsional, sinyalNaN. Sebuah sinyal NaN dalam operasi aritmatika (termasuk perbandingan numerik) akan menyebabkan "tidak valid" pengecualian untuk diberi sinyal.
Representasi NaN ditentukan oleh standar memiliki beberapa bit tidak ditentukan yang dapat digunakan untuk mengkodekan jenis atau sumber kesalahan; tetapi tidak ada standar untuk pengkodean itu. Secara teori, NaN sinyal dapat digunakan oleh sistem runtime untuk bendera variabel yang tidak diinisiasi, atau memperpanjang angka floating-point dengan nilai-nilai khusus lainnya tanpa memperlambat perhitungan dengan nilai-nilai biasa, meskipun ekstensi tersebut tidak umum.
IEEE 754 desain dasar pemikiran
William Kahan . Seorang arsitek utama dari Intel 80x87 floating-point coprocessor danIEEE 754 standar floating-point.
Ini adalah kesalahpahaman umum bahwa fitur yang lebih esoteris dari standar IEEE 754 dibahas di sini, seperti format diperpanjang, NaN, infinities, subnormals dll, hanya menarik bagi analis numerik , atau untuk aplikasi numerik canggih; pada kenyataannya sebaliknya adalah benar: fitur ini dirancang untuk memberikan default kuat aman untuk programmer numerik canggih, selain untuk mendukung perpustakaan numerik canggih oleh para ahli. Perancang utama IEEE 754, Prof. W. Kahan mencatat bahwa itu adalah salah untuk "... [anggap] fitur Standar IEEE 754 untuk Binary floating titik Arithmetic yang ... [yang] tidak dihargai menjadi fitur yang dapat digunakan oleh none namun para ahli numerik. Fakta-fakta yang cukup sebaliknya. Pada tahun 1977 fitur tersebut dirancang ke dalam Intel 8087 untuk melayani pasar seluas mungkin .... Kesalahan-analisis memberitahu kita bagaimana merancang floating-point aritmatika, seperti IEEE Standard 754, cukup toleran terhadap bermaksud baik ketidaktahuan kalangan programmer ". [ 12 ]
- Nilai-nilai khusus seperti infinity dan NaN memastikan bahwa floating-point aritmatika aljabar selesai, sehingga setiap operasi floating-point menghasilkan hasil yang jelas dan tidak akan secara default melempar interupsi mesin atau perangkap. Selain itu, pilihan dari nilai-nilai khusus kembali dalam kasus luar biasa yang dirancang untuk memberikan jawaban yang benar dalam banyak kasus, misalnya terus pecahan seperti R (z): = 7-3 / (z - 2 - 1 / (z - 7 + 10 / (z - 2-2 / (z - 3)))) akan memberikan jawaban yang benar di semua masukan di bawah IEEE-754 aritmatika sebagai potensi bagi dengan nol di misalnya R (3) = 4,6 dengan benar ditangani sebagai + infinity dan sehingga dapat diabaikan dengan aman. [ 13 ] Sebagaimana dicatat oleh Kahan, perangkap tertangani berturut-turut untuk floating-point 16-bit konversi integer overflow yang menyebabkan hilangnya Ariane 5 roket tidak akan terjadi di bawah standar IEEE 754 floating Kebijakan titik. [ 12 ]
- Nomor subnormal memastikan bahwa untuk terbatas floating-point nomor x dan y, x -. y = 0 jika dan hanya jika x = y, seperti yang diharapkan, tetapi yang tidak tahan di bawah sebelumnya representasi floating-point [ 14 ]
- Pada alasan desain x87 Format 80-bit , Prof. Kahan mencatat: "format diperpanjang ini dirancang untuk digunakan, dengan kerugian diabaikan kecepatan, untuk semua tapi aritmatika sederhana dengan float dan double operan Misalnya, harus. digunakan untuk variabel awal dalam loop yang menerapkan kambuh seperti evaluasi polinomial, produk skalar, pecahan parsial dan melanjutkan. Sering averts dini Over / Underflow atau pembatalan lokal parah yang dapat merusak algoritma sederhana. [ 15 ] Komputasi hasil antara dalam format diperpanjang dengan presisi tinggi dan eksponen diperpanjang memiliki preseden dalam praktek sejarah ilmiah perhitungan dan desain kalkulator ilmiah kalkulator keuangan misalnya Hewlett Packard melakukan aritmatika dan fungsi keuangan untuk tiga desimal signifikan daripada mereka disimpan atau ditampilkan. [ 15 ] Pelaksanaan diperpanjang presisi diaktifkan standar dasar fungsi perpustakaan untuk dengan mudah dikembangkan yang biasanya memberikan hasil presisi ganda dalam satu unit tempat terakhir (ULP) dengan kecepatan tinggi.
- Pembulatan benar nilai-nilai ke nilai representable terdekat menghindari bias sistematis dalam perhitungan dan memperlambat pertumbuhan kesalahan. Pembulatan hubungan bahkan menghilangkan bias statistik yang dapat terjadi dalam menambahkan angka-angka serupa.
- Disutradarai pembulatan dimaksudkan sebagai bantuan dengan memeriksa batas kesalahan, misalnya dalam aritmatika interval. Hal ini juga digunakan dalam pelaksanaan beberapa fungsi.
- Dasar matematika dari operasi memungkinkan presisi tinggi subrutin aritmatika berbentuk frase yang akan dibangun relatif mudah.
- Format presisi tunggal dan ganda yang dirancang agar mudah untuk menyortir tanpa menggunakan floating-point hardware.
Nomor representable, konversi dan pembulatan
Secara alami mereka, semua nomor dinyatakan dalam format floating-point adalah bilangan rasional dengan ekspansi mengakhiri di dasar yang relevan (misalnya, ekspansi desimal mengakhiri di basis-10, atau ekspansi biner mengakhiri di basis-2). Bilangan irasional, seperti π atau √2, atau non-terminating bilangan rasional, harus didekati. Jumlah digit (atau bit) presisi juga membatasi himpunan bilangan rasional yang dapat diwakili dengan tepat. Sebagai contoh, jumlah 123456789 tidak dapat persis diwakili jika hanya delapan digit desimal presisi yang tersedia.
Ketika nomor direpresentasikan dalam beberapa format (seperti string karakter) yang bukan merupakan representasi floating-point asli didukung dalam implementasi komputer, maka akan membutuhkan konversi sebelum dapat digunakan dalam pelaksanaan itu. Jika nomor dapat diwakili tepat dalam format floating-point maka konversi yang tepat. Jika tidak ada representasi yang tepat maka konversi membutuhkan pilihan yang floating-point nomor digunakan untuk mewakili nilai asli. Representasi yang dipilih akan memiliki nilai yang berbeda dengan aslinya, dan nilai sehingga disesuaikan disebut nilai bulat .
Apakah atau tidak bilangan rasional memiliki ekspansi terminating tergantung di pangkalan. Sebagai contoh, dalam basis-10 nomor 1/2 memiliki ekspansi terminating (0,5) sementara jumlah 1/3 tidak (0,333 ...). Dalam basis-2 hanya rationals dengan penyebut yang merupakan pangkat 2 (seperti 1/2 atau 16/03) yang mengakhiri. Setiap rasional dengan penyebut yang memiliki faktor prima selain 2 akan memiliki ekspansi biner yang tak terbatas. Ini berarti bahwa angka yang muncul untuk menjadi pendek dan tepat ketika ditulis dalam format desimal mungkin perlu didekati bila dikonversi ke biner floating-point. Sebagai contoh, angka desimal 0,1 tidak representable dalam biner floating-point dari setiap presisi terbatas; representasi biner yang tepat akan memiliki "1100" urutan terus tanpa henti:
e = -4; s = 1100110011001100110011001100110011 ...,
mana, seperti sebelumnya, s adalah significand dan e adalah eksponen.
Ketika dibulatkan menjadi 24 bit ini menjadi
e = -4; s = 110011001100110011001101,
yang sebenarnya 0,100000001490116119384765625 dalam desimal.
Sebagai contoh lagi, bilangan real π , direpresentasikan dalam biner sebagai seri terbatas dari bit
11,0010010000111111011010101000100010000101101000110000100011010011 ...
tetapi
11,0010010000111111011011
ketika didekati dengan pembulatan ke presisi dari 24 bit.
Dalam biner presisi tunggal floating-point, ini direpresentasikan sebagai s = 1,10010010000111111011011 dengan e = 1. Ini memiliki nilai desimal dari
3.141592 7410125732421875,
sedangkan perkiraan yang lebih akurat dari nilai sebenarnya dari π adalah
3,14159265358979323846264338327950 ...
Hasil pembulatan berbeda dari nilai sebenarnya sekitar 0,03 bagian per juta, dan sesuai dengan representasi desimal π dalam pertama 7 digit. Perbedaannya adalah kesalahan diskritisasi dan dibatasi oleh mesin epsilon .
Perbedaan aritmatika antara dua representable angka floating-point berturut-turut yang memiliki eksponen yang sama disebut satuan di tempat terakhir (ULP). Sebagai contoh, jika tidak ada nomor representable terletak di antara representable nomor 1.45a70c22 hexdan 1.45a70c24 hex , ULP adalah 2 × 16 -8 , atau 2 -31 . Untuk angka dengan dasar-2 eksponen bagian dari 0, nomor yaitu dengan nilai absolut lebih besar atau sama dengan 1 tetapi lebih rendah dari 2, sebuah ULP adalah persis 2 -23 atau sekitar 10 -7 dalam presisi tunggal, dan tepat 2 -53 atau sekitar 10 -16 dalam presisi ganda. Perilaku diamanatkan hardware IEEE-compliant adalah bahwa hasilnya berada dalam satu-setengah dari ULP.
Pembulatan mode
Pembulatan digunakan ketika hasil yang tepat dari operasi floating-point (atau konversi ke format floating-point) akan membutuhkan lebih banyak digit dari ada angka di significand tersebut. IEEE 754 memerlukan pembulatan yang benar : yaitu, hasil bulat adalah seolah-olah jauh tepat aritmatika yang digunakan untuk perhitungan nilai dan kemudian dibulatkan (meskipun dalam pelaksanaannya hanya tiga bit ekstra yang diperlukan untuk memastikan hal ini). Ada beberapa yang berbeda skema pembulatan (atau pembulatan mode ). Secara historis, pemotongan adalah pendekatan yang khas. Sejak diperkenalkannya IEEE 754, metode default ( bulat untuk terdekat, hubungan bahkan , kadang-kadang disebut Banker Pembulatan) lebih sering digunakan. Metode ini putaran yang ideal (tak terbatas tepat) hasil dari operasi aritmatika dengan nilai representable terdekat, dan memberikan bahwa representasi sebagai hasilnya. [ 16 ] Dalam kasus dasi, nilai yang akan membuat akhir significand dalam bahkan digit dipilih. IEEE 754 standar memerlukan pembulatan yang sama untuk diterapkan pada semua operasi aljabar yang mendasar, termasuk akar kuadrat dan konversi, ketika ada angka (non-NaN) hasil. Ini berarti bahwa hasil dari IEEE 754 operasi sepenuhnya ditentukan dalam semua bit dari hasilnya, kecuali untuk representasi NaN. ("Perpustakaan" fungsi seperti kosinus dan log tidak diamanatkan.)
Pilihan pembulatan alternatif juga tersedia. IEEE 754 menentukan mode pembulatan berikut:
- bulat untuk terdekat, di mana ikatan bulat untuk terdekat bahkan digit dalam posisi yang dibutuhkan (default dan sejauh modus yang paling umum)
- bulat untuk terdekat, di mana ikatan bulat dari nol (opsional untuk biner floating-point dan umum digunakan dalam desimal)
- mengumpulkan (ke arah + ∞; hasil negatif sehingga putaran menuju nol)
- putaran bawah (menuju -∞, hasil negatif sehingga putaran dari nol)
- bulat menuju nol (pemotongan, melainkan mirip dengan perilaku umum float-to-bilangan bulat konversi, yang mengubah -3,9 ke -3 dan 3,9-3)
Moda alternatif berguna ketika jumlah kesalahan yang diperkenalkan harus dibatasi. Aplikasi yang membutuhkan kesalahan dibatasi adalah multi-presisi floating-point, danaritmatika selang . Modus pembulatan alternatif juga berguna dalam mendiagnosis ketidakstabilan numerik: jika hasil subrutin bervariasi secara substansial antara pembulatan ke + dan - infinity maka kemungkinan numerik tidak stabil dan dipengaruhi oleh kesalahan round-off. [ 17 ]
Floating-point operasi aritmatika
Untuk memudahkan presentasi dan pemahaman, desimal radix dengan 7 digit presisi akan digunakan dalam contoh-contoh, seperti dalam IEEE 754 decimal32 Format. Prinsip-prinsip dasar yang sama dalam setiap radix atau presisi, kecuali normalisasi yang bersifat opsional (tidak mempengaruhi nilai numerik dari hasil). Di sini, s menunjukkan significand dan e menunjukkan eksponen.
Penambahan dan pengurangan
Sebuah metode sederhana untuk menambahkan angka floating-point adalah untuk pertama mewakili mereka dengan eksponen yang sama. Dalam contoh di bawah, angka kedua digeser tepat oleh tiga digit, dan kami kemudian dilanjutkan dengan metode penambahan biasa:
123.456,7 = 1,234567 × 10 ^ 5
101.7654 = 1.017654 × 10 ^ 2 = 0,001017654 × 10 ^ 5
Oleh karena itu:
123.456,7 + 101,7654 = (1,234567 × 10 ^ 5) + (1,017654 × 10 ^ 2)
= (1.234567 × 10 ^ 5) + (0,001017654 × 10 ^ 5)
= (1.234567 + 0,001017654) × 10 ^ 5
= 1,235584654 × 10 ^ 5
Secara rinci:
e = 5; s = 1.234567 (123.456,7)
+ E = 2; s = 1.017654 (101.7654)
e = 5; s = 1.234567
+ E = 5; s = 0,001017654 (setelah pergeseran)
--------------------
e = 5; s = 1,235584654 (true sum: 123558,4654)
Ini adalah hasil yang benar, jumlah yang tepat dari operan. Ini akan dibulatkan menjadi tujuh angka dan kemudian dinormalisasi jika perlu. Hasil akhir adalah
e = 5; s = 1.235585 (akhir sum: 123.558,5)
Perhatikan bahwa rendah tiga digit dari operan kedua (654) pada dasarnya hilang. Ini adalah kesalahan round-off . Dalam kasus ekstrim, jumlah dari dua angka bukan nol mungkin sama dengan salah satu dari mereka:
e = 5; s = 1.234567
+ E = -3; s = 9.876543
e = 5; s = 1.234567
+ E = 5; s = 0,00000009876543 (setelah pergeseran)
----------------------
e = 5; s = 1,23456709876543 (true sum)
e = 5; s = 1.234567 (setelah pembulatan / normalisasi)
Perhatikan bahwa dalam contoh-contoh konseptual di atas itu akan muncul bahwa sejumlah besar tambahan digit akan perlu disediakan oleh penambah untuk memastikan pembulatan yang benar: bahkan untuk penambahan biner atau pengurangan menggunakan teknik implementasi hati-hati hanya dua tambahan penjaga bit dan satu tambahan lengketbit perlu dilakukan di luar ketepatan operan. [ 11 ]
Masalah lain kehilangan signifikansi terjadi ketika dua nomor dekat dikurangi. Dalam contoh berikut e = 5; s = 1,234571 dan e = 5; s = 1,234567 adalah representasi dari rationals 123.457,1467 dan 123.456,659.
e = 5; s = 1.234571
- E = 5; s = 1.234567
----------------
e = 5; s = 0.000004
e = -1; s = 4.000000 (setelah pembulatan / normalisasi)
Representasi terbaik dari perbedaan ini adalah e = -1; s = 4,877000, yang berbeda lebih dari 20% dari e = -1; s = 4,000000. Dalam kasus ekstrim, semua angka yang signifikan presisi bisa hilang (walaupun underflow bertahap memastikan bahwa hasilnya tidak akan menjadi nol kecuali dua operan yang sama). Ini pembatalan menggambarkan bahaya dalam asumsi bahwa semua angka dari hasil dihitung bermakna. Berurusan dengan konsekuensi dari kesalahan ini adalah topik dalam analisis numerik ; lihat juga masalah Akurasi .
Perkalian dan pembagian
Untuk memperbanyak, para significands dikalikan sementara eksponen ditambahkan, dan hasilnya adalah bulat dan normal.
e = 3; s = 4.734612
× e = 5; s = 5.417242
-----------------------
e = 8; s = 25,648538980104 (produk yang benar)
e = 8; s = 25,64854 (setelah pembulatan)
e = 9; s = 2.564854 (setelah normalisasi)
Demikian pula, pembagian dilakukan dengan mengurangi eksponen pembagi ini dari eksponen dividen ini, dan membagi significand dividen oleh significand pembagi ini.
Tidak ada pembatalan atau penyerapan masalah dengan perkalian atau pembagian, meskipun kesalahan kecil dapat terakumulasi sebagai operasi dilakukan berturut-turut. [ 18 ]Dalam prakteknya, cara operasi ini dilakukan dalam logika digital dapat cukup kompleks (lihat algoritma perkalian Booth dan algoritma pembagian ). [ 19 ] Untuk cepat, metode sederhana, lihat metode Horner .
Menangani kasus-kasus yang luar biasa
Floating-point dalam komputer dapat berjalan menjadi tiga jenis masalah:
- Sebuah operasi dapat secara matematis terdefinisi, seperti ∞ / ∞, atau pembagian dengan nol.
- Sebuah operasi dapat hukum pada prinsipnya, tetapi tidak didukung oleh format tertentu, misalnya, menghitung akar kuadrat dari -1 atau sinus kebalikan dari 2 (keduanya menghasilkan bilangan kompleks ).
- Sebuah operasi dapat hukum pada prinsipnya, tapi hasilnya bisa tidak mungkin untuk mewakili dalam format yang ditentukan, karena eksponen terlalu besar atau terlalu kecil untuk mengkodekan dalam bidang eksponen. Peristiwa semacam itu disebut melimpah (eksponen terlalu besar), underflow (eksponen terlalu kecil) atau denormalization (rugi presisi).
Sebelum standar IEEE, kondisi seperti biasanya disebabkan program untuk mengakhiri, atau memicu semacam jebakan bahwa programmer mungkin bisa menangkap. Bagaimana ini bekerja adalah bergantung pada sistem, yang berarti bahwa program floating-point tidakportabel . (Perhatikan bahwa istilah "pengecualian" seperti yang digunakan dalam IEEE-754 adalah istilah umum yang berarti kondisi yang luar biasa, yang belum tentu kesalahan, dan merupakan penggunaan yang berbeda dengan yang biasanya didefinisikan dalam bahasa pemrograman seperti C ++ atau Java, di yang merupakan " pengecualian "adalah sebuah aliran alternatif kontrol, lebih dekat dengan apa yang disebut" perangkap "di IEEE-754 terminologi).
Di sini, metode standar yang dibutuhkan penanganan pengecualian menurut IEEE 754 dibahas (IEEE-754 perangkap opsional dan lainnya "exception handling alternatif" mode tidak dibahas). Pengecualian aritmatika adalah (secara default) yang diperlukan untuk disimpan di "lengket" bit flag status. Bahwa mereka adalah "lengket" berarti bahwa mereka tidak diatur ulang oleh berikutnya (aritmatika) operasi, tetapi tetap mengatur sampai eksplisit ulang. Penggunaan "lengket" bendera sehingga memungkinkan untuk pengujian kondisi luar biasa ditunda sampai setelah ekspresi floating-point penuh atau subroutine: tanpa mereka kondisi luar biasa yang tidak dapat dinyatakan diabaikan akan membutuhkan pengujian eksplisit segera setelah setiap operasi floating-point. Secara default, operasi selalu mengembalikan hasilnya sesuai dengan spesifikasi tanpa mengganggu perhitungan. Misalnya, 1/0 kembali + ∞, sementara juga pengaturan membagi-by-zero flag bit (default ini ∞ dirancang sehingga sering mengembalikan hasil yang terbatas bila digunakan dalam operasi berikutnya dan jadi diabaikan dengan aman).
Asli IEEE 754 standar, namun, gagal untuk merekomendasikan operasi untuk menangani set seperti aritmatika bit bendera pengecualian. Jadi sementara tersebut telah digunakan di perangkat keras, awalnya pemrograman implementasi bahasa biasanya tidak menyediakan sarana untuk mengaksesnya (terlepas dari assembler). Seiring waktu beberapa standar bahasa pemrograman (misalnya, C99 / C11 dan Fortran) telah diperbarui untuk menentukan metode untuk mengakses dan status perubahan bendera bit. Versi 2008 dari standar IEEE 754 sekarang menetapkan beberapa operasi untuk mengakses dan menangani bit bendera aritmatika. Model pemrograman didasarkan pada satu benang eksekusi dan penggunaan mereka dengan beberapa benang harus ditangani oleh sarana di luar standar (misalnya C11 menetapkan bahwa bendera memiliki thread-lokal penyimpanan ).
IEEE 754 menetapkan lima pengecualian aritmatika yang akan dicatat dalam status flag ("bit sticky"):
- eksak , mengatur jika dibulatkan (dan kembali) nilai berbeda dari hasil matematis yang tepat dari operasi.
- underflow , mengatur jika nilai bulat kecil (sebagaimana ditentukan dalam IEEE 754) dan eksak (atau mungkin terbatas pada jika memiliki kerugian denormalization, sesuai versi 1984 dari IEEE 754), mengembalikan nilai subnormal termasuk nol.
- melimpah , set jika nilai absolut dari nilai bulat terlalu besar untuk diwakili. Sebuah infinity atau nilai terbatas maksimal dikembalikan, tergantung pada pembulatan digunakan.
- membagi-dengan-nol , set jika hasilnya adalah tak terbatas diberikan operan terbatas, kembali sebuah infinity, baik + ∞ atau -∞.
- valid , mengatur jika hasil bernilai real tidak dapat dikembalikan misalnya sqrt (-1) atau 0/0, mengembalikan NaN tenang.
Gambar. 1: resistensi secara paralel, dengan resistansi total 

Nilai kembali default untuk setiap pengecualian dirancang untuk memberikan hasil yang benar dalam sebagian besar kasus tersebut bahwa pengecualian dapat diabaikan di sebagian besar kode. eksak kembali hasil benar bulat, dan underflow mengembalikan nilai kecil denormalized dan sebagainya hampir selalu dapat diabaikan. [ 20 ] membagi-dengan-nol kembali infinity persis, yang biasanya akan kemudian membagi jumlah terbatas dan memberikan nol, atau yang lain akan memberikan valid pengecualian kemudian jika tidak, dan begitu juga biasanya dapat diabaikan. Sebagai contoh, resistansi efektif n resistor secara paralel (lihat gbr. 1) diberikan oleh
.Jika arus pendek berkembang dengan
set ke 0,
akan kembali + infinity yang akan memberikan akhir
dari 0, seperti yang diharapkan [ 21 ] (lihat contoh fraksi terus IEEE 754 desain dasar pemikiran untuk contoh lain).




Overflow dan tidak valid pengecualian biasanya tidak dapat diabaikan, tetapi tidak mewakili kesalahan: misalnya, akar-menemukan rutin, sebagai bagian dari operasi normal, dapat mengevaluasi fungsi berlalu-in di nilai luar domainnya, kembali NaN dan sebuahvalid bendera pengecualian untuk diabaikan sampai menemukan titik awal yang berguna. [ 22 ]
Masalah akurasi
Fakta bahwa angka floating-point tidak bisa tepat mewakili semua bilangan real, dan bahwa operasi floating-point tidak bisa tepat mewakili operasi aritmatika benar, menyebabkan banyak situasi mengejutkan. Hal ini terkait dengan yang terbatas presisidengan mana komputer umumnya mewakili angka.
Sebagai contoh, non-representability dari 0,1 dan 0,01 (dalam biner) berarti bahwa hasil dari mencoba untuk persegi 0.1 bukanlah 0,01 maupun nomor representable terdekat untuk itu. Pada 24-bit (presisi tunggal) representasi, 0,1 (desimal) diberikan sebelumnya sebagai e = -4; s = 110011001100110011001101, yang
0,100000001490116119384765625 persis.
Mengkuadratkan angka ini memberikan
0,010000000298023226097399174250313080847263336181640625 persis.
Mengkuadratkan dengan floating-point presisi tunggal hardware (dengan pembulatan) memberi
0,010000000707805156707763671875 persis.
Namun jumlah representable terdekat dengan 0,01 adalah
,009999999776482582092285156250 Persis.
Juga, non-representability dari π (π dan / 2) berarti bahwa perhitungan percobaan tan (π / 2) tidak akan menghasilkan hasil yang tak terhingga, dan tidak akan bahkan melimpah. Hal ini hanya tidak mungkin untuk standar floating-point perangkat keras untuk mencoba untuk menghitung tan (π / 2), karena π / 2 tidak dapat diwakili tepat. Perhitungan ini di C:
/ * Cukup digit untuk memastikan kita mendapatkan pendekatan yang benar. * /
ganda pi = 3,1415926535897932384626433832795 ;
ganda z = tan ( pi / 2.0 ) ;
akan memberikan hasil dari 16331239353195370,0. Dalam presisi tunggal (menggunakan fungsi TANF), hasilnya akan -22.877.332,0.
Dengan cara yang sama, sebuah perhitungan berusaha dosa (π) tidak akan menghasilkan nol. Hasilnya akan (kurang-lebih) 0,1225 × 10 -15 dalam presisi ganda, atau -0,8742 × 10-7 di presisi tunggal. [ 23 ]
Sementara penambahan floating-point dan perkalian keduanya komutatif ( a + b = b + adan a × b = b × a ), mereka tidak selalu asosiatif . Artinya, ( a + b ) + c belum tentu sama dengan a + ( b + c ). Menggunakan 7-digit significand aritmatika desimal:
a = 1234.567, b = 45,67834, c = 0,0004
(A + b) + c:
1234.567 (a)
+ 45,67834 (b)
____________
1280,24534 putaran untuk 1280,245
1280.245 (a + b)
+ 0,0004 (c)
____________
1280.2454 putaran untuk 1280.245 <--- (a + b) + c
a + (b + c):
45,67834 (b)
+ 0,0004 (c)
____________
45,67874
1234.567 (a)
+ 45,67874 (b + c)
____________
1280,24574 putaran untuk 1280,246 <--- a + (b + c)
Mereka juga belum tentu distributif . Artinya, ( a + b ) × c tidak mungkin sama dengansebuah × c + b × c :
1234.567 × 3.333333 = 4115.223
1.234567 × 3.333333 = 4.115223
4115.223 + 4.115223 = 4119.338
tapi
1234.567 + 1.234567 = 1235.802
1235.802 × 3.333333 = 4119.340
Selain kehilangan signifikansi, ketidakmampuan untuk mewakili nomor seperti π dan 0,1 persis, dan ketidakakuratan sedikit lain, fenomena berikut mungkin terjadi:
- Pembatalan :. pengurangan operan hampir sama dapat menyebabkan hilangnya ekstrim akurasi [ 24 ] Ketika kita kurangi dua angka hampir sama kita menetapkan paling signifikan angka nol, meninggalkan diri kita sendiri dengan hanya signifikan, dan yang paling salah, digit. Sebagai contoh, ketika menentukan turunan dari fungsi rumus berikut digunakan:

Secara intuitif orang akan ingin h sangat dekat dengan nol, namun ketika menggunakan operasi floating-point, jumlah terkecil tidak akan memberikan pendekatan terbaik terhadap derivatif. Sebagai h tumbuh lebih kecil perbedaan antara f (a + h) dan f (a) tumbuh lebih kecil, membatalkan angka yang paling signifikan dan paling salah dan membuat sebagian keliru digit lebih penting. Akibatnya jumlah terkecil h mungkin akan memberikan perkiraan yang lebih keliru dari turunan dari jumlah yang agak lebih besar. Ini mungkin masalah akurasi paling umum dan serius.
- Konversi ke integer tidak intuitif: mengkonversi (63.0 / 9.0) ke integer hasil 7, tetapi mengubah (0.63 / 0.09) dapat menghasilkan 6. Hal ini karena konversi umumnya memotong bukan bulat. Lantai dan fungsi langit-langit dapat menghasilkan jawaban yang off dengan salah satu dari nilai intuitif diharapkan.
- Kisaran eksponen terbatas: Hasil mungkin meluap menghasilkan infinity, atau underflow menghasilkan sejumlah subnormal atau nol. Dalam kasus ini presisi akan hilang.
- Pengujian untuk divisi aman bermasalah: Memeriksa bahwa pembagi tidak nol tidak menjamin bahwa divisi tidak akan meluap.
- Pengujian untuk kesetaraan bermasalah. Dua urutan komputasi yang secara matematis sama mungkin menghasilkan nilai floating-point yang berbeda.
Insiden
- Pada tanggal 25 Pebruari 1991, kehilangan signifikansi dalam MIM-104 Patriotbaterai rudal mencegahnya mencegat sebuah masuk Scud rudal di Dhahran ,Arab Saudi , memberikan kontribusi bagi kematian 28 tentara dari Angkatan Darat AS 14 Quartermaster Detachment . [ 25 ] Lihat juga : Kegagalan di Dhahran
Mesin presisi dan analisis kesalahan mundur
Mesin presisi adalah besaran yang mencirikan keakuratan sistem floating-point, dan digunakan dalam analisis kesalahan mundur dari algoritma floating-point. Hal ini juga dikenal sebagai satuan roundoff atau mesin epsilon . Biasanya dilambangkan Ε mach , nilainya tergantung pada pembulatan yang digunakan.
Dengan pembulatan ke nol,

sedangkan pembulatan ke terdekat,

Hal ini penting karena batas yang galat relatif mewakili non-nol bilangan real x dalam kisaran normal dari sistem floating-point:

Analisis kesalahan Mundur, teori yang dikembangkan dan dipopulerkan oleh James H. Wilkinson , dapat digunakan untuk menetapkan bahwa suatu algoritma melaksanakan fungsi numerik numerik stabil. [ 26 ] Pendekatan dasar adalah untuk menunjukkan bahwa meskipun hasil perhitungan, karena kesalahan pembulatan, tidak akan persis benar, itu adalah solusi yang tepat untuk masalah terdekat dengan input data sedikit terganggu. Jika gangguan yang dibutuhkan kecil, di urutan ketidakpastian dalam input data, maka hasilnya dalam arti seakurat data "layak". Algoritma ini kemudian didefinisikan sebagai mundur stabil . Stabilitas adalah ukuran sensitivitas pembulatan kesalahan prosedur numerik yang diberikan; sebaliknya, bilangan kondisi dari fungsi untuk masalah yang diberikan menunjukkan sensitivitas yang melekat pada fungsi untuk gangguan kecil dalam masukan dan independen dari implementasi yang digunakan untuk memecahkan masalah. [ 27 ]
Sebagai contoh sepele, pertimbangkan ekspresi sederhana memberikan produk batin (panjang dua) vektor
dan
, Maka








dan





dimana
, Menurut definisi

yang merupakan jumlah dari dua sedikit terganggu (pada urutan Ε mach ) input data, dan begitu juga mundur stabil. Untuk contoh yang lebih realistis dalam aljabar linear numerikmelihat Higham 2002 dan referensi lain di bawah).
Meminimalkan dampak masalah akurasi
Meskipun, seperti yang telah dijelaskan sebelumnya, operasi aritmatika individu IEEE 754 dijamin akurat ke dalam setengah ULP, formula yang lebih rumit dapat menderita kesalahan besar karena round-off. Hilangnya akurasi sangat besar jika masalah atau data yang sakit-AC , yang berarti bahwa hasil yang benar adalah hipersensitif terhadap gangguan kecil dalam datanya. Namun, bahkan fungsi yang baik-AC bisa menderita kerugian besar akurasi jika algoritma numerik yang tidak stabil untuk data yang digunakan: formulasi tampaknya setara dengan ekspresi dalam bahasa pemrograman dapat sangat berbeda dalam stabilitas numerik mereka. Salah satu pendekatan untuk menghilangkan risiko kerugian seperti akurasi adalah desain dan analisis algoritma numerik stabil, yang merupakan tujuan dari cabang matematika yang dikenal sebagai analisis numerik . Pendekatan lain yang dapat melindungi terhadap risiko ketidakstabilan numerik adalah perhitungan menengah (awal) nilai-nilai dalam suatu algoritma dengan presisi lebih tinggi daripada hasil akhir membutuhkan, [ 28 ] yang dapat menghapus, atau mengurangi oleh lipat, [ 29 ] risiko tersebut: IEEE 754 presisi quadruple dan presisi diperpanjang . dirancang untuk tujuan ini ketika menghitung di presisi ganda [ 30 ] [ 31 ]
Sebagai contoh, algoritma berikut adalah implementasi langsung untuk menghitung fungsi A (x) = (x-1) / (exp (x-1) - 1) yang baik-AC di 1.0, [ 32 ] namun dapat terbukti secara numerik tidak stabil dan kehilangan hingga setengah signifikan digit dibawa oleh aritmatika ketika dihitung dekat 1.0. [ 12 ]
ganda A ( ganda X )
{
ganda Y , Z ; // [1]
Y = X - 1,0 ;
Z = exp ( Y ) ;
jika ( Z =! 1.0 ) Z = Y / ( Z - 1,0 ) ; // [2]
pulang ( Z ) ;
}
Namun, jika perhitungan antara semua dilakukan dalam presisi diperpanjang (misalnya dengan menetapkan garis [1] untuk c99 long double), maka sampai dengan presisi penuh dalam hasil ganda akhir dapat dipertahankan. [ 33 ] Atau, analisis numerik dari algoritma mengungkapkan bahwa jika mengikuti perubahan non-jelas dengan garis [2] dibuat:
jika ( Z =! 1.0 ) Z = log ( Z ) / ( Z - 1.0 ) ;
maka algoritma menjadi numerik stabil dan dapat menghitung dengan presisi ganda penuh.
Untuk menjaga sifat-sifat hati-hati dibangun program numerik stabil seperti, penanganan hati-hati oleh compiler diperlukan. Tertentu "optimasi" bahwa kompiler mungkin membuat (misalnya, penataan kembali operasi) dapat bekerja melawan tujuan perangkat lunak berperilaku baik. Ada beberapa kontroversi tentang kegagalan kompiler dan desain bahasa di daerah ini: C99 adalah contoh dari bahasa mana optimasi tersebut secara hati-hati ditentukan sehingga dapat menjaga presisi numerik. Lihat referensi eksternal di bagian bawah artikel ini.
Sebuah pengobatan rinci tentang teknik untuk menulis perangkat lunak berkualitas tinggi floating-point berada di luar lingkup artikel ini, dan pembaca disebut, [ 34 ] [ 35 ] dan referensi lain di bagian bawah artikel ini. Kahan menyarankan beberapa aturan praktis yang secara substansial dapat menurunkan dengan urutan magnitudo [ 35 ] risiko anomali numerik, selain, atau sebagai pengganti, analisis numerik lebih berhati-hati. Ini termasuk: seperti disebutkan di atas, komputasi semua ekspresi dan hasil antara dalam presisi tertinggi yang didukung dalam perangkat keras (aturan umum praktis adalah untuk membawa dua kali ketepatan yang diinginkan hasil yaitu menghitung dalam presisi ganda untuk hasil presisi tunggal akhir, atau di ganda presisi diperpanjang atau quad hingga hasil presisi ganda [ 36 ] ); dan pembulatan input data dan hasil hanya presisi yang diperlukan dan didukung oleh data input (membawa presisi kelebihan hasil akhir di luar itu diperlukan dan didukung oleh input data bisa menyesatkan, meningkatkan biaya penyimpanan dan mengurangi kecepatan, dan kelebihan bit dapat mempengaruhi konvergensi prosedur numerik: [ 37 ] terutama, bentuk pertama dari contoh berulang diberikan di bawah menyatu dengan benar saat menggunakan aturan ini). Deskripsi singkat tentang beberapa isu dan teknik tambahan ikuti.
Sebagai pecahan desimal sering tidak tepat diwakili dalam biner floating-point, aritmatika tersebut adalah yang terbaik ketika itu hanya digunakan untuk mengukur jumlah dunia nyata melalui berbagai skala (seperti periode orbit bulan sekitar Saturnus atau massa dariproton ), dan yang paling buruk ketika diharapkan untuk model interaksi jumlah dinyatakan sebagai string desimal yang diharapkan tepatnya. [ 38 ] [ 39 ] Contoh kasus terakhir adalah perhitungan keuangan. Untuk alasan ini, perangkat lunak keuangan cenderung tidak menggunakan representasi nomor floating-point biner. [ 40 ] The "desimal" tipe data dari C # dan Python bahasa pemrograman, dan format desimal dari IEEE 754-2008 standar, dirancang untuk menghindari masalah biner representasi floating-point bila diterapkan pada nilai-nilai desimal yang tepat manusia masuk, dan membuat aritmatika selalu berperilaku seperti yang diharapkan ketika nomor yang tercetak dalam desimal.
Harapan dari matematika tidak dapat diwujudkan dalam bidang floating-point. Sebagai contoh, diketahui bahwa
, Dan bahwa
Namun fakta-fakta ini tidak dapat diandalkan ketika jumlah yang terlibat adalah hasil dari perhitungan floating-point.


Penggunaan tes kesetaraan ( if (x==y) ... ) membutuhkan perawatan ketika berhadapan dengan angka floating-point. Bahkan ekspresi sederhana seperti 0.6/0.2-3==0 akan, pada kebanyakan komputer, gagal menjadi kenyataan [41] (dalam IEEE 754 presisi ganda, misalnya, 0.6/0.2-3 kira-kira sama dengan -4.44089209850063e-16) . Akibatnya, tes tersebut kadang-kadang diganti dengan "kabur" perbandingan ( if (abs(xy) < epsilon) ... , dimana epsilon cukup kecil dan disesuaikan dengan aplikasi, seperti 1.0E-13). Kebijaksanaan melakukan hal ini sangat bervariasi, dan dapat memerlukan analisis numerik untuk epsilon terikat. [42] Nilai berasal dari representasi data primer dan perbandingan mereka harus dilakukan dalam lebih luas, diperpanjang, presisi untuk meminimalkan risiko inkonsistensi tersebut karena putaran kesalahan-off. [35] Hal ini sering lebih baik untuk mengatur kode sedemikian rupa bahwa tes tersebut tidak diperlukan. Misalnya, dalam geometri komputasi , tes yang tepat dari apakah titik terletak di lepas atau pada garis atau bidang yang ditentukan oleh poin lainnya dapat dilakukan dengan menggunakan presisi adaptif atau metode aritmatika yang tepat. [43]
Kesalahan kecil dalam aritmatika floating-point dapat tumbuh ketika algoritma matematika melakukan operasi sejumlah besar kali. Beberapa contoh adalah matriks inversi ,eigenvector komputasi, dan pemecahan persamaan diferensial. Algoritma ini harus dirancang sangat hati-hati, dengan menggunakan pendekatan numerik seperti perbaikan Iteratif , jika mereka bekerja dengan baik. [44]
Penjumlahan dari vektor nilai-nilai floating-point merupakan algoritma dasar dalamkomputasi ilmiah , dan sebagainya kesadaran ketika kehilangan signifikansi dapat terjadi sangat penting. Sebagai contoh, jika ada yang menambahkan jumlah yang sangat besar dari angka, addends individu sangat kecil dibandingkan dengan jumlah. Hal ini dapat menyebabkan hilangnya signifikansi. Sebuah tambahan yang khas maka akan menjadi sesuatu seperti
3253.671
+ 3.141276
--------
3256.812
Rendahnya 3 digit dari addends secara efektif hilang. Anggaplah, misalnya, salah satu yang perlu untuk menambahkan banyak angka, semua kurang lebih sama dengan 3. Setelah 1000 dari mereka telah ditambahkan, jumlah berjalan adalah sekitar 3000; angka yang hilang tidak kembali. The Kahan Algoritma penjumlahan dapat digunakan untuk mengurangi kesalahan. [45]
Round-off error dapat mempengaruhi konvergensi dan akurasi prosedur numerik iteratif. Sebagai contoh, Archimedes diperkirakan π dengan menghitung perimeter poligon inscribing dan circumscribing lingkaran, dimulai dengan segi enam, dan berturut-turut dua kali lipat jumlah sisi. Seperti disebutkan di atas, perhitungan dapat disusun kembali dengan cara yang secara matematis setara tapi kurang rentan terhadap kesalahan ( analisis numerik). Dua bentuk rumus kekambuhan untuk poligon dibatasi adalah:



Berikut merupakan perhitungan menggunakan IEEE "ganda" (significand dengan 53 bit presisi) aritmatika:
i 6 × 2 × i t i, bentuk pertama 6 × 2 × i t i, bentuk kedua
0 3 0,4641016151377543863 3 ,4641016151377543863
1 3 0,2153903091734710173 3 ,2153903091734723496
2 3.1 596599420974940120 3.1 596599420975006733
3 3.14 60862151314012979 3.14 60862151314352708
4 3.14 27145996453136334 3.14 27145996453689225
5 3,141 8730499801259536 3,141 8730499798241950
6 3,141 3,141 6627470548084133 6627470568494473
7 3,141 6101765997805905 3,141 6101766046906629
8 3,14159 3,14159 70343230776862 70343215275928
9 3,14159 3,14159 37488171150615 37487713536668
10 3.141592 3.141592 9278733740748 9273850979885
11 3.141592 3.141592 7256228504127 7220386148377
12 3.1415926 717412858693 3.1415926 707019992125
13 3.1415926 189011456060 3.14159265 78678454728
14 3.1415926 717412858693 3.14159265 46593073709
15 3,14159 19358822321783 3,141592653 8571730119
16 3.1415926 717412858693 3,141592653 6566394222
17 3,1415 810075796233302 3,141592653 6065061913
18 3.1415926 717412858693 3,1415926535 939.728.836
19 3,141 4061547378810956 3,1415926535 908.393.901
20 3.14 05434924008406305 3,1415926535 900.560.168
21 3.14 00068646912273617 3,141592653589 8.608.396
22 3.1 349453756585929919 3,141592653589 8.122.118
23 3.14 00068646912273617 3,14159265358979 95552
24 3 0,2245152435345525443 3,14159265358979 68907
25 3,14159265358979 62246
26 3,14159265358979 62246
27 3,14159265358979 62246
28 3,14159265358979 62246
Nilai sebenarnya adalah3,14159265358979323846264338327 ...
Sementara dua bentuk rumus kekambuhan jelas matematis setara, [46] yang mengurangi pertama 1 dari sejumlah sangat dekat dengan 1, yang menyebabkan kerugian semakin bermasalah signifikan digit . Sebagai kekambuhan diterapkan berulang kali, akurasi membaik pada awalnya, tapi kemudian memburuk. Tidak pernah mendapat lebih baik dari sekitar 8 digit, meskipun 53-bit aritmatika harus mampu sekitar 16 digit presisi. Ketika bentuk kedua kekambuhan yang digunakan, nilai konvergen 15 digit presisi.
aritmatika floating point: Isu dan Keterbatasan
Angka floating-point diwakili dalam perangkat keras komputer sebagai basis 2 (biner) fraksi. Sebagai contoh, pecahan desimal
0.125
memiliki nilai 1/10 + 2/100 + 5/1000, dan dengan cara yang sama fraksi biner
0.001
memiliki nilai 0/2 + 0/4 + 1/8. Kedua fraksi memiliki nilai yang identik, satu-satunya perbedaan yang nyata adalah bahwa yang pertama ditulis dalam basis 10 notasi pecahan, dan yang kedua dalam basis 2.
Sayangnya, sebagian besar pecahan desimal tidak dapat diwakili tepat sebagai pecahan biner. Konsekwensinya adalah bahwa, secara umum, angka floating-point desimal yang Anda masukkan hanya didekati dengan angka floating-point biner sebenarnya disimpan dalam mesin.
Masalahnya adalah lebih mudah untuk memahami pada awalnya dalam basis 10. Pertimbangkan fraksi 1/3. Anda dapat perkiraan bahwa sebagai fraksi basis 10:
0,3
atau, lebih baik,
0.33
atau, lebih baik,
0,333
dan sebagainya. Tidak peduli berapa banyak digit Anda bersedia untuk menuliskan, hasilnya tidak akan persis 1/3, tetapi akan menjadi sebuah pendekatan yang semakin lebih baik dari 1/3.
Dengan cara yang sama, tidak peduli berapa banyak basis 2 digit Anda bersedia untuk menggunakan, nilai desimal 0.1 tidak dapat diwakili tepat sebagai 2 fraksi dasar. Dalam basis 2, 1/10 adalah fraksi tak terhingga mengulangi
0,0001100110011001100110011001100110011001100110011 ...
Berhenti di setiap jumlah terbatas bit, dan Anda mendapatkan perkiraan.
Pada mesin khas menjalankan Python, ada 53 bit presisi tersedia untuk pelampung Python, sehingga nilai yang disimpan secara internal ketika Anda memasukkan angka desimal 0.1adalah fraksi biner
0,00011001100110011001100110011001100110011001100110011010
yang dekat dengan, tapi tidak persis sama dengan, 10/1.
Sangat mudah untuk lupa bahwa nilai yang disimpan adalah pendekatan terhadap fraksi desimal asli, karena cara yang mengapung ditampilkan di interpreter prompt. Python hanya mencetak pendekatan desimal ke nilai desimal sebenarnya dari pendekatan biner yang disimpan oleh mesin. Jika Python adalah untuk mencetak nilai desimal sebenarnya dari pendekatan biner yang disimpan selama 0,1, itu akan menampilkan
>>>
>>> 0.1
0,1000000000000000055511151231257827021181583404541015625
Yang lebih digit dari kebanyakan orang menemukan berguna, sehingga Python terus jumlah digit dikelola dengan menampilkan nilai bulat bukan
>>>
>>> 0.1
0,1
Sangat penting untuk menyadari bahwa ini adalah, dalam arti yang sebenarnya, ilusi: nilai dalam mesin tidak tepat 1/10, Anda hanya pembulatan tampilan nilai mesin yang benar. Fakta ini menjadi jelas segera setelah Anda mencoba untuk melakukan aritmatika dengan nilai-nilai ini
>>>
>>> 0.1 + 0.2
0,30000000000000004
Catatan bahwa ini adalah sifat yang sangat biner floating-point: ini bukan bug di Python, dan itu bukan bug dalam kode Anda baik. Anda akan melihat hal yang sama dalam semua bahasa yang mendukung floating-point aritmatika hardware Anda (meskipun beberapa bahasa mungkin tidak menampilkan perbedaan secara default, atau dalam semua mode output).
Kejutan lain mengikuti dari yang satu ini. Sebagai contoh, jika Anda mencoba untuk melengkapi nilai 2,675 sampai dua tempat desimal, Anda mendapatkan ini
>>>
>>> Bulat (2,675, 2) 2.67
Dokumentasi untuk built-in round () fungsi mengatakan bahwa putaran ke nilai terdekat, pembulatan hubungan dari nol. Karena pecahan desimal 2,675 persis setengah jalan antara 2.67 dan 2.68, Anda mungkin mengharapkan hasil di sini untuk menjadi (pendekatan biner untuk) 2.68. Ini bukan, karena ketika string desimal 2,675 dikonversi ke nomor floating-point biner, itu lagi diganti dengan pendekatan biner, yang nilai yang tepat adalah
2,67499999999999982236431605997495353221893310546875
Karena pendekatan ini sedikit lebih dekat ke 2.67 daripada 2.68, itu dibulatkan ke bawah.
Jika Anda berada dalam situasi di mana Anda peduli arah mana desimal Anda setengah-kasus dibulatkan, Anda harus mempertimbangkan menggunakan desimal modul. Kebetulan, desimal modul juga menyediakan cara yang bagus untuk "melihat" nilai yang tepat yang disimpan di setiap Python mengambang tertentu
>>>
>>> Dari desimal impor Decimal
>>> Decimal (2,675)
Desimal ('2,67499999999999982236431605997495353221893310546875')
Konsekuensi lain adalah bahwa karena 0,1 tidak persis 1/10, menjumlahkan sepuluh nilai 0,1 mungkin tidak menghasilkan persis 1.0, baik:
>>>
>>> Sum = 0.0
>>> For i in range (10):
... Sum + = 0,1
...
>>> Sum
0,9999999999999999
Biner aritmatika floating-point memegang banyak kejutan seperti ini. Masalah dengan "0,1" dijelaskan secara rinci tepat di bawah, di "Representasi Kesalahan" bagian. Lihat The Perils of floating point untuk account yang lebih lengkap kejutan umum lainnya.
Sebagai yang mengatakan mendekati akhir, "tidak ada jawaban yang mudah." Namun, jangan terlalu waspada terhadap floating-point! Kesalahan dalam operasi float Python diwarisi dari floating-point hardware, dan pada kebanyakan mesin berada pada urutan tidak lebih dari 1 bagian dalam 2 ** 53 per operasi. Itu lebih dari cukup untuk sebagian besar tugas, tetapi Anda perlu diingat bahwa itu tidak desimal aritmatika, dan bahwa setiap operasi bilangan riel dapat menderita kesalahan pembulatan baru.
Sementara kasus-kasus patologis memang ada, untuk penggunaan kasual yang paling floating-point aritmatika Anda akan melihat hasil yang Anda harapkan pada akhirnya jika Anda hanya putaran tampilan hasil akhir Anda ke jumlah digit desimal yang Anda harapkan. Untuk kontrol baik atas bagaimana pelampung ditampilkan melihat str.format () format specifiers metode dalam Format String Sintaks .
Tidak ada komentar:
Posting Komentar