Programiranje

Aritmetika s plavajočo vejico

Dobrodošli v drugem delu Pod pokrovom. Cilj tega stolpca je razvijalcem Java omogočiti vpogled v skrito lepoto pod njihovimi programi Java. Ta stolpec nadaljuje razpravo, ki se je začela prejšnji mesec, nabora ukazov bajt kode navideznega stroja Java (JVM). Ta članek si ogleduje aritmetiko s plavajočo vejico v JVM in zajema bajtode, ki izvajajo aritmetične operacije s plavajočo vejico. V nadaljnjih člankih bomo razpravljali o drugih članih družine bajt kod.

Glavne plavajoče točke

Podpora s plavajočo vejico JVM ustreza standardu IEEE-754 1985 s plavajočo vejico. Ta standard določa obliko 32-bitnih in 64-bitnih števil s plavajočo vejico in določa operacije nad njimi. V JVM se aritmetika s plavajočo vejico izvaja na 32-bitnih plovcih in 64-bitnih dvojicah. Za vsako bajtno kodo, ki izvaja aritmetiko na floats, obstaja ustrezna bajtoda, ki izvede enako operacijo pri dvojicah.

Število s plavajočo vejico ima štiri dele - znak, mantiso, radiks in eksponent. Znak je bodisi 1 bodisi -1. Mantisa, ki je vedno pozitivno število, vsebuje pomembne številke števila s plavajočo vejico. Eksponent označuje pozitivno ali negativno moč radiksa, s katerim je treba mantiso in znak pomnožiti. Štiri komponente so kombinirane na naslednji način, da dobimo vrednost s plavajočo vejico:

znak * mantissa * eksponent radix

Števila s plavajočo vejico imajo več predstavitev, ker lahko mantiso katerega koli števila s plavajočo vejico vedno pomnožimo z neko močjo radiksa in spremenimo eksponent, da dobimo prvotno število. Število -5 lahko na primer enakomerno predstavlja katera koli od naslednjih oblik v radiksu 10:

Oblike -5
PodpišiMantissaEksponent Radix
-15010 -1
-1510 0
-10.510 1
-10.0510 2

Za vsako število s plavajočo vejico obstaja ena predstavitev, ki naj bi bila normalizirano. Število s plavajočo vejico je normalizirano, če je njena mantisa znotraj obsega, ki ga določa naslednja relacija:

1 / radix <= mantissa <

Normalizirano število s plavajočo vejico radix 10 ima svojo decimalno vejico levo od prve številke, ki ni nič v mantisi. Normalizirana predstavitev s plavajočo vejico -5 je -1 * 0,5 * 10 1. Z drugimi besedami, mantisa normaliziranega števila s plavajočo vejico nima števk, ki niso nič na levi strani decimalne vejice, in nič ničle, desno od decimalne vejice. Vsaka številka s plavajočo vejico, ki ne sodi v to kategorijo, naj bi bila denormalizirano. Upoštevajte, da številka nič nima normalizirane predstavitve, ker nima številke, ki ni nič, ki bi jo postavili desno od decimalne vejice. "Zakaj normalizirati?" je pogost vzklik med ničlami.

Števila s plavajočo vejico v JVM uporabljajo polmer dveh. Števila s plavajočo vejico v JVM imajo zato naslednjo obliko:

znak * mantissa * 2 eksponent

Mantisa števila s plavajočo vejico v JVM je izražena kot binarno število. Normalizirana mantisa ima svojo binarno točko (osnovni ekvivalent dve decimalni vejici) levo od najpomembnejše ne-ničte številke. Ker ima binarni številski sistem le dve števki - nič in eno - je najpomembnejša številka normalizirane mantise vedno ena.

Najpomembnejši bit float ali double je njegov bit bit. Mantisa zaseda 23 najmanj pomembnih bitov plovca in 52 najmanj pomembnih bitov dvojnika. Eksponent, 8 bitov v plovcu in 11 bitov v dvojcu, se nahaja med znakom in mantiso. Format plovca je prikazan spodaj. Znakovni bit je prikazan kot "s", eksponentni bit so prikazani kot "e", bitov mantise pa kot "m":

Bitna postavitev Java float
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

Znakovni bit nič pomeni pozitivno število, znakovni bit ena pa negativno število. Mantiso vedno razlagajo kot pozitivno številko dva. To ni dvojno dopolnilo. Če je znakovni bit ena, je vrednost s plavajočo vejico negativna, vendar se mantisa še vedno razlaga kot pozitivno število, ki ga je treba pomnožiti z -1.

Eksponentno polje se razlaga na enega od treh načinov. Eksponent vseh označuje, da ima število s plavajočo vejico eno od posebnih vrednosti plus ali minus neskončnost ali "ni število" (NaN). NaN je rezultat nekaterih operacij, na primer delitve ničle z ničlo. Eksponent vseh ničel označuje denormalizirano število s plavajočo vejico. Kateri koli drugi eksponent označuje normalizirano število s plavajočo vejico.

Mantisa vsebuje en dodaten del natančnosti, ki presega tiste, ki se pojavijo v bitjih mantise. Mantisa plovca, ki zavzame le 23 bitov, ima 24 bitov natančnosti. Mantisa dvojnika, ki zaseda 52 bitov, ima 53 bitov natančnosti. Najpomembnejši bit mantisse je predvidljiv in zato ni vključen, ker eksponent števil s plavajočo vejico v JVM označuje, ali je število normalizirano ali ne. Če so eksponentne ničle, je število s plavajočo vejico denormalizirano in najpomembnejši bit mantisse je nič. V nasprotnem primeru je število s plavajočo vejico normalizirano in znano je, da je najpomembnejši del mantise.

JVM ne povzroča izjem zaradi kakršnih koli operacij s plavajočo vejico. Posebne vrednosti, kot sta pozitivna in negativna neskončnost ali NaN, se vrnejo kot rezultat sumljivih operacij, kot je deljenje z ničlo. Eksponent vseh označuje posebno vrednost s plavajočo vejico. Eksponent vseh tistih z mantiso, katerih biti so nič, pomeni neskončnost. Znak neskončnosti označuje znakovni bit. Eksponent vseh s katero koli drugo mantiso se razlaga tako, da pomeni "ne število" (NaN). JVM vedno proizvede isto mantiso za NaN, kar so vse ničle, razen najpomembnejšega bitov mantisse, ki se pojavi v številu. Te vrednosti so prikazane za plovec spodaj:

Posebne plavajoče vrednosti
VrednostFloat bit (eksponent znaka mantissa)
+ Neskončnost0 11111111 00000000000000000000000
-Neskončnost1 11111111 00000000000000000000000
NaN1 11111111 10000000000000000000000

Eksponenti, ki niso niti vsi niti ničli, kažejo na moč dveh, s katerimi pomnožimo normalizirano mantiso. Moč dveh lahko določimo tako, da eksponentne bitove interpretiramo kot pozitivno število in nato od pozitivnega števila odštejemo pristranskost. Za float je pristranskost 126. Za dvojno je pristranskost 1023. Na primer, eksponentno polje v float-u 00000001 daje moč dve, tako da od eksponentnega polja, ki se razlaga kot pozitivno celo število, odštejemo pristranskost (126) (1). Moč dveh je torej 1 - 126, kar je -125. To je najmanjša možna moč dveh za plovec. V drugi skrajnosti pa eksponentno polje 11111110 daje moč dveh od (254 - 126) ali 128. Število 128 je največja moč dveh, ki je na voljo plovcu. V naslednji tabeli je prikazanih več primerov normaliziranih floatov:

Normalizirane plavajoče vrednosti
VrednostFloat bit (eksponent znaka mantissa)Nepristranski eksponent
Največji pozitivni (končni) plovec0 11111110 11111111111111111111111128
Največji negativni (končni) plovec1 11111110 11111111111111111111111128
Najmanjši normaliziran plovec1 00000001 00000000000000000000000-125
Pi0 10000000 100100100001111110110112

Eksponent vseh ničel kaže, da je mantisa denormalizirana, kar pomeni, da je nenavedeni vodilni bit namesto ena enak nič. Moč dveh je v tem primeru enaka najmanjši moči dveh, ki je na voljo normalizirani mantisi. Za plovec je to -125. To pomeni, da imajo normalizirane mantike, pomnožene z dvema, dvignjenima v stopnjo -125, eksponentno polje 00000001, medtem ko imajo denormalizirane mantike, pomnožene z dvema, dvignjenima v stopnjo -125, eksponentno polje 00000000. Dodatek za denormalizirana števila na dnu konec obsega eksponentov podpira postopno podlivanje. Če bi namesto tega uporabili najnižji eksponent za predstavitev normaliziranega števila, bi pri večjih številih prišlo do podtoka do nič. Z drugimi besedami, puščanje najnižjega eksponenta za denormalizirana števila omogoča predstavitev manjših števil. Manjša denormalizirana števila imajo manj bitov natančnosti kot normalizirana števila, vendar je to zaželeno, da se podtoči na nič, takoj ko eksponent doseže najnižjo normalizirano vrednost.

Denormalizirane float vrednosti
VrednostFloat bit (eksponent znaka mantissa)
Najmanjši pozitivni (ne nič) plovec0 00000000 00000000000000000000001
Najmanjši negativni (ne nič) plovec1 00000000 00000000000000000000001
Največji denormaliziran plovec1 00000000 11111111111111111111111
Pozitivna ničla0 00000000 00000000000000000000000
Negativna nič1 00000000 00000000000000000000000

Izpostavljeni plovec

Java float razkriva svojo notranjo naravo Spodnji programček vam omogoča igranje s formatom s plavajočo vejico. Vrednost float je prikazana v več oblikah. Format dvakratnega znanstvenega zapisa prikazuje mantiso in eksponent v osnovi deset. Pred prikazom se dejanska mantisa pomnoži z 2 24, kar da integralno število, nepristranski eksponent pa se zmanjša za 24. Tako integralno mantiso kot eksponent nato enostavno pretvorimo v osnovo deset in prikažemo.

$config[zx-auto] not found$config[zx-overlay] not found