Perkembangan Komputer Generasi 1-5
Kamis, 09 Januari 2020
Rabu, 08 Januari 2020
Pengertian ALU, Integer Representation, Integer Arithmetic, Floating Point Representation, Floating Point Arithmetic
Pengertian ALU, Integer Representation, Integer Arithmetic, Floating Point Representation, Floating Point Arithmetic
Arithmatic Logical Unit (ALU), adalah komponen dalam
sistem komputer yang berfungsi melakukan operasi
perhitungan aritmatika dan logika (Contoh operasi aritmatika
adalah operasi penjumlahan dan pengurangan, sedangkan contoh operasi logika
adalah logika AND dan OR. ALU bekerja besama-sama memori, di mana
hasil dari perhitungan di dalamALU di simpan ke dalam memori.
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
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 .
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
dimana mengindikasikan
benar bulat aritmatika floating-point
dimana , Dari atas
dan
dimana
; ;
;
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 .
Langganan:
Komentar (Atom)
