Isi:
Gambar: http://pikabu.ru/
Pambuka
Ing dina wiwitan sinau basa Jawa, aku nemoni jinis primitif kayadene angka floating point. Aku langsung kasengsem karo fitur-fitur kasebut lan, luwih-luwih, kanthi cara sing ditulis ing kode binar (sing saling nyambungake). Boten kados sawetara wilangan bulat, malah ing sawetara banget cilik (contone, saka 1 kanggo 2) ana nomer tanpa wates. Lan duwe ukuran memori winates, iku mokal kanggo nyebut pesawat iki. Dadi, kepiye carane diekspresikake ing binar lan kepiye cara kerjane? Sayange, panjelasan ing
wiki lan artikel sing rada keren babagan Habré
ing kene ora menehi pangerten sing lengkap, sanajan dheweke nggawe dhasar. Kawujudan kasebut mung sawise maca
artikel analisis iki esuk sawise maca.
Excursion menyang sajarah
(
dijupuk saka artikel iki ing Habré ) Ing taun 60-70-an, nalika komputer gedhe lan program cilik, isih ora ana standar siji-sijine kanggo petungan, uga standar kanggo nyebut nomer floating point dhewe. Saben komputer nindakake kanthi beda, lan saben duwe kesalahan dhewe. Nanging ing agêng-70s, Intel mutusaké kanggo nggawe prosesor anyar karo didhukung aritmetika "apik" lan ing wektu sing padha standarisasi. Profesor William Kahan lan John Palmer (ora, dudu penulis buku babagan bir) digawa kanggo ngembangake. Ana sawetara drama, nanging standar anyar dikembangake. Saiki standar iki diarani IEEE754
Format angka floating point
Malah ing buku teks sekolah, saben wong ngadhepi cara nulis sing ora biasa banget utawa nomer cilik banget, yaiku
1.2 × 10 3 utawa
1.2 E3 , sing padha karo
1.2 × 1000 = 1200 . Iki diarani metode notasi eksponensial. Ing kasus iki, kita dealing karo ekspresi nomer nggunakake rumus:
N = M × n p , ngendi
- N = 1200 - nomer asil
- M = 1,2 - mantissa - bagean pecahan, tanpa njupuk pesenan akun
- n = 10 minangka basis urutan. Ing kasus iki lan nalika kita ora ngomong babagan komputer, dhasar yaiku nomer 10
- p = 3 - derajat saka basa
Cukup asring, dhasar urutan dianggep dadi 10
lan mung mantissa lan nilai dhasar sing ditulis, misahake karo huruf
E. Ing conto kita, aku menehi entri sing padha karo
1.2 × 10 3 lan
1.2 E3 Yen kabeh wis jelas, lan kita wis rampung dolan nostalgia menyang kurikulum sekolah, mula saiki aku nyaranake dilalekake, amarga nalika mbentuk nomer floating point sing kita tindakake. kakuwasan loro, ora puluhan, i.e.
n = 2 , kabeh rumus harmonis
1.2E3 rusak lan tenan nyuwil otak.
Tandha lan gelar
Dadi apa sing kita duwe? Akibaté, kita uga duwe nomer binar, sing kasusun saka
mantissa - bagean sing bakal kita mundhakaken menyang daya lan daya dhewe. Kajaba iku, kaya sing umum karo jinis integer, angka floating-point duweni bit sing nemtokake tandha - apa nomer kasebut bakal positif utawa negatif. Minangka conto, aku propose kanggo nimbang jinis
float
, kang kasusun saka 32 bit. Kanthi nomer tliti pindho
double
logika padha, mung ana kaping pindho minangka akeh bit. Saka 32 bit, sing paling penting pisanan dialokasikan kanggo tandha, 8 bit sabanjure dialokasikan kanggo eksponen - daya sing bakal kita mundhakaken mantissa, lan 23 bit sing isih ana - menyang mantissa. Kanggo nduduhake, ayo goleki conto:
Bit pisanan gampang banget. Yen nilai bit pisanan
iku 0 , banjur nomer kita njaluk bakal
positif . Yen bit
1 , banjur nomer bakal
negatif . Blok sabanjure 8 bit yaiku blok eksponen. Eksponen ditulis minangka nomer
wolung bit biasa , lan kanggo entuk gelar sing dibutuhake, kita kudu nyuda
127 saka nomer asil . Ing kasus kita, wolung bit saka eksponen yaiku
10000001 . Iki cocog karo nomer
129 . Yen sampeyan duwe pitakonan babagan carane ngetung iki, banjur gambar nuduhake jawaban cepet. Versi sing ditambahi bisa dipikolehi ing sembarang kursus aljabar Boolean.
1×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Ora angel ngetung yen jumlah maksimal sing bisa dipikolehi saka 8 bit iki yaiku
11111111 2 = 255 10 (subskrip
2 lan
10 tegese sistem nomer biner lan desimal) Nanging, yen mung nggunakake nilai eksponen positif. (
saka 0 kanggo 255 ), banjur nomer asil bakal akeh nomer sadurunge titik desimal, nanging ora sawise? Kanggo entuk nilai negatif saka gelar, sampeyan kudu nyuda
127 saka eksponen sing digawe . Mangkono, sawetara derajat bakal
saka -127 kanggo 128 . Yen kita nggunakake conto, gelar sing dibutuhake yaiku
129-127 = 2 . Ayo padha ngelingi nomer iki kanggo saiki.
Mantissa
Saiki babagan mantissa. Iku kasusun saka 23 bit, nanging ing awal tansah ana unit liyane diwenehake, kang bit ora diparengake. Iki ditindakake kanthi alasan ekonomi lan ekonomi. Nomer sing padha bisa ditulis ing macem-macem kekuwatan kanthi nambahake nol menyang mantissa sadurunge utawa sawise titik desimal. Cara paling gampang kanggo mangerteni iki yaiku kanthi eksponen desimal:
120.000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 etc. Nanging, kanthi ngetik nomer tetep ing sirah mantissa, kita bakal nampa nomer anyar saben wektu. Ayo dadi njupuk kanggo diwenehake sing sadurunge kita 23 bit bakal ana siji liyane karo siji. Biasane bit iki dipisahake saka liyane kanthi titik, sing, nanging ora ateges apa-apa. Iku mung luwih trep 1. 1110000000000000000000000000000000000000000000000000
Saiki asil Mantissa kudu ditimbulake kanthi kekuwatan saka kiwa menyang tengen, nyuda kekuwatan kanthi siji langkah. Kita miwiti kanthi nilai daya sing dipikolehi minangka asil pitungan, yaiku
2 (Aku sengaja milih conto sing gampang supaya ora nulis saben nilai kekuwatan loro lan ora ngetung ing tabel ing ndhuwur nalika bit sing cocog yaiku nol)
1×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7.5 lan entuk asil
7.5 , bener bisa dicenthang, contone, ing
link iki
Asil
Nomer floating-point standar
float
kasusun saka 32 bit, bit pisanan minangka tandha (+ utawa -), wolung sabanjure minangka eksponen, sabanjure 23 minangka mantissa Miturut tandha - yen bit 0 minangka nomer positif. Yen bit 1 negatif.
Miturut eksponensial - kita ngowahi bitwise dadi angka desimal (bit pisanan saka sisih kiwa yaiku
128 , kaloro yaiku
64 , katelu yaiku
32 , kaping papat yaiku
16 , kaping lima yaiku
8 , kaping enem yaiku
4 , kaping pitu yaiku
2 , kaping wolu yaiku
1 ), nyuda
127 saka nomer asil , kita entuk gelar sing bakal diwiwiti.
Miturut mantissa - kanggo 23 bit sing ana ing ngarep kita nambah bit liyane karo nilai 1 lan saka iku kita wiwiti mundhakaken menyang daya kita nampa, decrementing daya iki saben dicokot sakteruse.
Kuwi kabeh, bocah-bocah! PS: Minangka peer, nggunakake artikel iki, tinggalake ing komentar versi sampeyan kenapa kesalahan presisi kedadeyan karo operasi aritmetika kanthi nomer floating point.
GO TO FULL VERSION