Zvisizvo Zvimiro zveMarudzi Chaiwo, kana Chenjera neREAL

Mushure mekudhindwa zvinyorwa nezve maficha ekunyora muPostgreSQL, yekutanga kutaura yaive nezve kuoma kwekushanda nenhamba chaidzo. Ndakafunga kutarisa nekukurumidza kodhi yemibvunzo yeSQL inowanikwa kwandiri kuti ndione kuti vanowanzoshandisa sei REAL mhando. Zvinoitika kuti inoshandiswa kazhinji, uye vanogadzira havawanzonzwisisa njodzi dziri shure kwayo. Uye izvi zvisinei nekuti kune akawanda akawanda ezvinyorwa zvakanaka paInternet uye paHabrΓ© nezve maficha ekuchengeta nhamba chaidzo mundangariro dzekombuta uye nezvekushanda navo. Naizvozvo, muchinyorwa chino ndichaedza kushandisa maficha akadaro kuPostgreSQL, uye ndichaedza kutarisa nekukurumidza matambudziko ane chekuita nawo, kuti zvive nyore kune vanogadzira mibvunzo yeSQL kuti vadzivise.

Zvinyorwa zvePostgreSQL zvinoti muchidimbu: "Kutonga kwezvikanganiso zvakadaro uye kuparadzirwa kwavo panguva yekuverenga inyaya yebazi rose remasvomhu nesainzi yekombuta, uye harina kuvharwa pano" (zvichireva zvine hungwaru muverengi kuIEEE 754 standard). Ndedzipi mhando dzemhosho dziri kurehwa pano? Ngatikurukurei zvakarongeka, uye zvichabuda pachena kuti nei ndakatora chinyoreso zvakare.

Ngatitorei semuenzaniso chikumbiro chiri nyore:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL;
**************************
float4
--------
    0.1
(1 строка)

Nekuda kweizvozvo, isu hatizooni chero chinhu chakakosha - isu tichawana inotarisirwa 0.1. Asi ikozvino ngatizvienzanise ne0.1:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL = 0.1;
**************************
?column?
----------
f
(1 строка)

Kwete kuenzana! Zvishamiso zvakadii! Asi zvakare, zvakanyanya. Mumwe munhu achati, ndinoziva kuti REAL inozvibata zvakashata nezvikamu, saka ini ndichaisa nhamba dzese ipapo, uye zvese zvichanyatso famba navo. Zvakanaka, ngatikande nhamba 123 kune REAL:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 123456789::REAL::INT;
**************************
   int4   
-----------
123456792
(1 строка)

Uye zvakazoitika kune mamwe matatu! Ndizvozvo, dhatabhesi yakazokanganwa kuverenga! Kana kuti tiri kutadza kunzwisisa chimwe chinhu? Ngatizvionei.

Kutanga, ngatirangarirei materiel. Sezvaunoziva, chero nhamba yedesimali inogona kuwedzerwa kuita masimba egumi. Saka, nhamba 123.456 ichave yakaenzana ne1*102 + 2*101 + 3*100 + 4*10-1 + 5*10-2 + ​​6*10-3. Asi komputa inoshanda nenhamba mune yebhinari fomu, saka dzinofanirwa kumiririrwa nenzira yekuwedzera mumasimba maviri. Nokudaro, nhamba 5.625 mubhinari inomiririrwa se 101.101 uye ichave yakaenzana ne1 * 22 + 0 * 21 + 1 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3. Uye kana masimba akanaka evaviri achigara achipa manhamba akazara (1, 2, 4, 8, 16, zvichingodaro), zvino neasina kunaka zvese zvinonetsa (0.5, 0.25, 0.125, 0,0625, nezvimwewo). Dambudziko nderekuti Haisi yedesimali yese inogona kumiririrwa sechidimbu chebhanari chinogumira. Nokudaro, yedu yakakurumbira 0.1 muchimiro chechidimbu chebhinari inoratidzika seyo periodic value 0.0 (0011). Nekuda kweizvozvo, kukosha kwekupedzisira kwenhamba iyi mundangariro yekombuta kuchasiyana zvichienderana nekudzika.

Ino ndiyo nguva yekuyeuka kuti nhamba chaidzo dzinochengetwa sei mundangariro dzekombuta. Kazhinji, nhamba chaiyo ine zvikamu zvitatu zvikuru - chiratidzo, mantissa uye exponent. Chiratidzo chinogona kuva kuwedzera kana kubvisa, saka chikamu chimwe chete chakagoverwa icho. Asi nhamba yezvimedu zve mantissa uye exponent inotarirwa nemhando chaiyo. Saka, kune iyo REAL mhando, kureba kwemantissa 23 bits (imwe bhiti yakaenzana ne1 inowedzerwa zvakajeka pakutanga kwe mantissa, uye mhedzisiro ndeye 24), uye exponent i8 bits. Zvose 32 bits, kana 4 bytes. Uye yemhando ye DOUBLE PRECISION, kureba kwemantissa kuchava 52 bits, uye exponent ichava 11 bits, yehuwandu hwe64 bits, kana 8 bytes. PostgreSQL haitsigire kurongeka kwepamusoro kwenhamba dzenzvimbo dzinoyangarara.

Ngatirongedze nhamba yedu yedesimali 0.1 mumhando mbiri REAL uye DOUBLE PRECISION. Sezvo chiratidzo uye kukosha kweiyo exponent zvakafanana, isu tichatarisa pane mantissa (ini ndinosiya nemaune izvo zvisiri pachena maficha ekuchengeta kukosha kweiyo exponent uye zero chaiyo kukosha, sezvo ivo vachikanganisa kunzwisisa uye kukanganisa kubva pane icho chinhu. yedambudziko, kana uchida, ona IEEE 754 standard). Tichawanei? Mumutsara wepamusoro ini ndichapa "mantissa" yemhando yeREAL (tichifunga nezve kutenderedzwa kwekupedzisira zvishoma ne1 kune iri pedyo inomiririrwa nhamba, zvikasadaro ichave 0.099999 ...), uye mumutsara wepasi - we iyo DOUBLE PRECISION mhando:

0.000110011001100110011001101
0.00011001100110011001100110011001100110011001100110011001

Zviri pachena kuti idzi nhamba mbiri dzakasiyana zvachose! Naizvozvo, pakuenzanisa, nhamba yekutanga ichaputirwa ne zero uye, saka, ichave yakakura kupfuura yechipiri (tichifunga nezve kutenderera - iyo yakanyorwa nemavara matema). Izvi zvinotsanangura kusajeka kubva mumienzaniso yedu. Mumuenzaniso wechipiri, nhamba yakanyatsotsanangurwa 0.1 inokandwa kune DOUBLE PRECISION mhando, uye inofananidzwa nehuwandu hwemhando yeREAL. Ose ari maviri akaderedzwa kurudzi rumwe, uye isu tine chaizvo zvatinoona pamusoro. Ngatigadzirise mubvunzo kuti zvese zviwire munzvimbo:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL > 0.1::DOUBLE PRECISION;
**************************
?column?
----------
t
(1 строка)

Uye zvechokwadi, nekuita kudzikisira kaviri kwenhamba 0.1 kune REAL uye DOUBLE PRECISION, tinowana mhinduro kuchirahwe:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL::DOUBLE PRECISION;
**************************

      float8       
-------------------
0.100000001490116
(1 строка)

Izvi zvinotsanangurawo muenzaniso wechitatu uri pamusoro. Nhamba 123 iri nyore hazvibviri kuisa mantissa kuita 24 bits (23 zvakajeka + 1 zvinoreva). Nhamba yepamusoro inokwanisa kupinda muzvikamu makumi maviri nemana i24-224 = 1. Naizvozvo, nhamba yedu 16 yakatenderedzwa kusvika kune iri pedyo inomiririrwa 777. Nekushandura mhando kuti DOUBLE PRECISION, hatichaoni chiitiko ichi:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 123456789::DOUBLE PRECISION::INT;
**************************
   int4   
-----------
123456789
(1 строка)

Ndizvo zvose. Zvinoratidza kuti hakuna minana. Asi zvese zvinotsanangurwa chikonzero chakanaka chekufunga nezvekuti unoda chaizvo rudzi rweREAL. Zvichida mukana mukuru wekushandiswa kwayo ndiko kukurumidza kwekuverenga nekuzivikanwa kurasikirwa kwechokwadi. Asi ichi chingava chiitiko chepasi rose chingapembedza kushandiswa kakawanda kwakadaro kworudzi urwu here? Usafunga.

Source: www.habr.com

Voeg