JavaRush /Java Blog /Random-TL /Ano ang nasa loob ng numero ng floating point at paano it...
Ivan
Antas
Харьков

Ano ang nasa loob ng numero ng floating point at paano ito gumagana?

Nai-publish sa grupo

Nilalaman:

Larawan: http://pikabu.ru/

Panimula

Sa mga unang araw ng pag-aaral ng Java, nakatagpo ako ng kakaibang uri ng mga primitive gaya ng mga floating point na numero. Agad akong naging interesado sa kanilang mga tampok at, higit pa, sa paraan ng pagkakasulat sa mga ito sa binary code (na magkakaugnay). Hindi tulad ng anumang hanay ng mga integer, kahit na sa isang napakaliit na hanay (halimbawa, mula 1 hanggang 2) mayroong isang walang katapusang bilang ng mga ito. At pagkakaroon ng isang may hangganan na laki ng memorya, imposibleng ipahayag ang set na ito. Kaya paano sila ipinahayag sa binary at paano sila gumagana? Sa kasamaang palad, ang mga paliwanag sa wiki at isang medyo cool na artikulo sa Habré dito ay hindi nagbigay sa akin ng kumpletong pag-unawa, kahit na inilatag nila ang pundasyon. Ang katuparan ay dumating lamang pagkatapos basahin ang artikulo ng pagsusuri na ito sa umaga pagkatapos basahin ito.

Iskursiyon sa kasaysayan

( kinuha mula sa artikulong ito sa Habré ) Noong 60-70s, kapag ang mga computer ay malalaki at ang mga programa ay maliit, wala pa ring iisang pamantayan para sa mga kalkulasyon, pati na rin ang isang pamantayan para sa pagpapahayag ng floating-point na numero mismo. Iba ang ginawa ng bawat computer, at bawat isa ay may kanya-kanyang pagkakamali. Ngunit noong kalagitnaan ng 70s, nagpasya ang Intel na gumawa ng mga bagong processor na may suportadong "pinabuting" aritmetika at sa parehong oras ay i-standardize ito. Sina Propesor William Kahan at John Palmer (hindi, hindi ang may-akda ng mga libro tungkol sa beer) ay dinala upang bumuo nito. Nagkaroon ng ilang drama, ngunit isang bagong pamantayan ang binuo. Ngayon ang pamantayang ito ay tinatawag na IEEE754

Format ng numero ng floating point

Kahit na sa mga aklat-aralin sa paaralan, ang lahat ay nahaharap sa isang hindi pangkaraniwang paraan ng pagsulat ng napakalaki o napakaliit na mga numero ng anyong 1.2 × 10 3 o 1.2 E3 , na katumbas ng 1.2 × 1000 = 1200 . Ito ay tinatawag na exponential notation method. Sa kasong ito, nakikitungo tayo sa pagpapahayag ng isang numero gamit ang formula: N=M×n p , kung saan
  • N = 1200 - ang resultang numero
  • M = 1,2 - mantissa - fractional na bahagi, nang hindi isinasaalang-alang ang mga order
  • n = 10 ay ang base ng order. Sa kasong ito at kapag hindi namin pinag-uusapan ang tungkol sa mga computer, ang base ay ang numero 10
  • p = 3 - antas ng base
Kadalasan, ang batayan ng pagkakasunud-sunod ay ipinapalagay na 10 at tanging ang mantissa at ang halaga ng base ang nakasulat, na pinaghihiwalay ang mga ito sa titik E. Sa aming halimbawa, nagbigay ako ng katumbas na mga entry na 1.2 × 10 3 at 1.2 E3 Kung ang lahat ay malinaw, at natapos na namin ang nostalgic na iskursiyon sa kurikulum ng paaralan, pagkatapos ngayon ay inirerekumenda ko na kalimutan ito, dahil kapag bumubuo ng isang lumulutang na numero na kinakaharap namin kapangyarihan ng dalawa, hindi sampu, i.e. n = 2 , nasira ang buong harmonious na formula 1.2E3 at talagang sinira nito ang utak ko.

Sign at degree

Kaya ano ang mayroon tayo? Bilang resulta, mayroon din tayong binary number, na binubuo ng isang mantissa - ang bahagi na itataas natin sa isang kapangyarihan at ang kapangyarihan mismo. Bilang karagdagan, tulad ng karaniwan sa mga uri ng integer, ang mga floating-point na numero ay may kaunti na tumutukoy sa sign - kung ang numero ay magiging positibo o negatibo. Bilang halimbawa, ipinapanukala kong isaalang-alang ang uri float, na binubuo ng 32 bits. Sa mga numero ng dobleng katumpakan doubleang lohika ay pareho, mayroon lamang dalawang beses na mas maraming mga bit. Sa 32 bits, ang unang pinaka makabuluhan ay inilalaan sa sign, ang susunod na 8 bits ay inilalaan sa exponent - ang kapangyarihan kung saan itataas natin ang mantissa, at ang natitirang 23 bits - sa mantissa. Upang ipakita, tingnan natin ang isang halimbawa: Ano ang nasa loob ng numero ng floating point at kung paano ito gumagana - 1Ang unang bit ay napaka-simple. Kung ang halaga ng unang bit ay 0 , kung gayon ang numerong makukuha natin ay magiging positibo . Kung ang bit ay 1 , kung gayon ang numero ay magiging negatibo . Ang susunod na bloke ng 8 bits ay isang exponent block. Ang exponent ay isinulat bilang isang ordinaryong walong-bit na numero, at upang makuha ang kinakailangang antas kailangan nating ibawas ang 127 mula sa resultang numero . Sa aming kaso, ang walong bits ng exponent ay 10000001 . Ito ay tumutugma sa bilang na 129 . Kung mayroon kang tanong tungkol sa kung paano kalkulahin ito, ang larawan ay nagpapakita ng isang mabilis na sagot. Maaaring makuha ang pinalawak na bersyon sa anumang kursong Boolean algebra. Ano ang nasa loob ng numero ng floating point at kung paano ito gumagana - 21×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 Hindi mahirap kalkulahin na ang maximum na numero na makukuha natin mula sa 8 bits na ito ay 11111111 2 = 255 10 (subscript 2 at 10 mean binary at decimal number system) Gayunpaman, kung gagamit lang tayo ng mga positibong exponent values ( mula 0 hanggang 255 ), kung gayon ang mga resultang numero ay magkakaroon ng maraming numero bago ang decimal point, ngunit hindi pagkatapos? Upang makakuha ng mga negatibong halaga ng antas, kailangan mong ibawas ang 127 mula sa nabuong exponent . Kaya, ang hanay ng mga degree ay mula -127 hanggang 128 . Gamit ang aming halimbawa, ang kinakailangang antas ay magiging 129-127 = 2 . Tandaan natin ang numerong ito sa ngayon.

Mantissa

Ngayon tungkol sa mantissa. Binubuo ito ng 23 bits, ngunit sa simula ay palaging may isa pang yunit na ipinahiwatig, kung saan ang mga bit ay hindi inilalaan. Ginagawa ito para sa mga dahilan ng kapakinabangan at ekonomiya. Ang parehong numero ay maaaring ipahayag sa iba't ibang kapangyarihan sa pamamagitan ng pagdaragdag ng mga zero sa mantissa bago o pagkatapos ng decimal point. Ang pinakamadaling paraan upang maunawaan ito ay gamit ang isang decimal exponent: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8 atbp. Gayunpaman, sa pamamagitan ng paglalagay ng nakapirming numero sa ulo ng mantissa, makakatanggap kami ng mga bagong numero sa bawat pagkakataon. Let's take it for granted na bago ang ating 23 bits ay may isa pa na may isa. Karaniwan ang bit na ito ay pinaghihiwalay mula sa iba sa pamamagitan ng isang tuldok, na, gayunpaman, ay walang ibig sabihin. Mas maginhawa lang 1. 111000000000000000000000 Ano ang nasa loob ng numero ng floating point at kung paano ito gumagana - 3Ngayon ang nagreresultang mantissa ay kailangang itaas sa isang kapangyarihan mula kaliwa hanggang kanan, binabawasan ang kapangyarihan ng isa sa bawat hakbang. Nagsisimula kami sa halaga ng kapangyarihan na nakuha namin bilang isang resulta ng pagkalkula, i.e. 2 (Sinadya kong pumili ng isang simpleng halimbawa upang hindi isulat ang bawat halaga ng kapangyarihan ng dalawa at hindi kinakalkula ang mga ito sa talahanayan sa itaas kapag ang katumbas na bit ay zero) Ano ang nasa loob ng numero ng floating point at paano ito gumagana - 41×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 at nakuha ang resulta 7.5 , maaaring suriin ang kawastuhan, halimbawa, sa link na ito

Mga resulta

Ang isang karaniwang floating-point na numero floatay binubuo ng 32 bits, ang unang bit ay ang sign (+ o -), ang susunod na walo ay ang exponent, ang susunod na 23 ay ang mantissa By sign - kung ang bit 0 ay isang positibong numero. Kung ang bit 1 ay negatibo. Sa pamamagitan ng exponential - kino-convert namin ang bitwise sa isang decimal na numero (ang unang bit mula sa kaliwa ay 128 , ang pangalawa ay 64 , ang pangatlo ay 32 , ang ikaapat ay 16 , ang ikalima ay 8 , ang ikaanim ay 4 , ang ikapito ay 2 , ang ikawalo ay 1 ), ibawas ang 127 mula sa resultang numero , makuha natin ang antas kung saan tayo magsisimula. Ayon sa mantissa - sa umiiral na 23 bits sa harap ay nagdaragdag kami ng isa pang bit na may halaga 1 at mula dito nagsisimula kaming tumaas sa kapangyarihan na aming natanggap, binabawasan ang kapangyarihang ito sa bawat kasunod na bit. Yan lang mga bata! Ano ang nasa loob ng numero ng floating point at kung paano ito gumagana - 5PS: Bilang araling-bahay, gamit ang artikulong ito, iwanan sa mga komento ang iyong mga bersyon kung bakit nangyayari ang mga error sa katumpakan sa isang malaking bilang ng mga pagpapatakbo ng arithmetic na may mga numero ng floating point
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION