Programmēšana

Peldošo punktu aritmētika

Laipni lūdzam citā Zem kapuces. Šīs slejas mērķis ir sniegt Java izstrādātājiem ieskatu slēptajā skaistumā, kas atrodas zem viņu darbojošajām Java programmām. Šī mēneša sleja turpina pagājušajā mēnesī sākto diskusiju par Java virtuālās mašīnas (JVM) baitu kodu instrukciju kopu. Šajā rakstā aplūkota peldošā komata aritmētika JVM un aplūkoti baitkodi, kas veic peldošā komata aritmētiskās darbības. Turpmākajos rakstos tiks apspriesti citi baitkodu saimes pārstāvji.

Galvenie peldošie punkti

JVM peldošā komata atbalsts atbilst IEEE-754 1985 peldošā komata standartam. Šis standarts nosaka 32 bitu un 64 bitu peldošā komata numuru formātu un nosaka darbības ar šiem numuriem. JVM peldošā komata aritmētika tiek veikta 32 bitu pludiņiem un 64 bitu dubultniekiem. Katram baitkodam, kas veic aritmētiku uz pludiņiem, ir atbilstošs baitkods, kas veic to pašu darbību dubultos.

Peldošā komata skaitlim ir četras daļas - zīme, mantissa, radix un eksponents. Zīme ir vai nu 1, vai -1. Mantisai, kas vienmēr ir pozitīvs skaitlis, pieder peldošā komata skaitļa nozīmīgie cipari. Eksponents norāda radiksa pozitīvo vai negatīvo spēku, ar kuru mantissa un zīme jāreizina. Četri komponenti tiek apvienoti šādi, lai iegūtu peldošā komata vērtību:

zīme * mantissa * radix eksponents

Peldošo punktu skaitļiem ir vairāki attēlojumi, jo vienmēr var pavairot jebkura peldošā komata skaitļa mantisu ar kādu radix jaudu un mainīt eksponentu, lai iegūtu sākotnējo skaitli. Piemēram, skaitli -5 var vienādi attēlot ar jebkuru no šīm formām 10. radiksā:

-5 formas
ParakstietiesMantissaRadix eksponents
-15010 -1
-1510 0
-10.510 1
-10.0510 2

Katram peldošā komata skaitlim ir viens attēlojums, kas tiek teikts normalizējās. Peldošā komata skaitlis tiek normalizēts, ja tā mantissa ir diapazonā, ko nosaka šāda sakarība:

1 / radix <= mantissa <

Normalizēta radix 10 peldošā komata skaitļa decimāldaļskaitlis atrodas tieši pa kreisi no pirmā nulles cipara mantisā. Normalizētais peldošā komata -5 attēlojums ir -1 * 0,5 * 10 1. Citiem vārdiem sakot, normalizēta peldošā komata skaitļa mantisā nav ciparu, kas nav nulle, pa kreisi no komata un nulle, kas nav nulle. aiz komata pa labi. Tiek uzskatīts, ka jebkurš peldošā komata numurs, kas neiederas šajā kategorijā denormalizēts. Ņemiet vērā, ka skaitlim nulle nav normalizēta attēlojuma, jo tam nav cipara, kas nav nulle, ko ievietot tikai aiz komata. "Kāpēc normalizēt?" ir izplatīts izsaukums starp nullēm.

Peldošo punktu skaitļos JVM tiek izmantots divu rādiuss. Tāpēc peldošā komata skaitļiem JVM ir šāda forma:

zīme * mantissa * 2 eksponents

Peldošā komata skaitļa mantissa JVM tiek izteikta kā binārs skaitlis. Normalizētajai mantisai binārais punkts (divu bāzes punktu ekvivalents pēc komata) atrodas tieši pa kreisi no nozīmīgākā cipara, kas nav nulle. Tā kā bināro skaitļu sistēmai ir tikai divi cipari - nulle un viens - normalizētās mantisas nozīmīgākais cipars vienmēr ir viens.

Nozīmīgākais pludiņa vai dubultā bits ir tā zīmes bits. Mantissa aizņem 23 vismazāk nozīmīgos pludiņa bitus un 52 vismazāk nozīmīgos dubultnieka bitus. Eksponents, 8 biti pludiņā un 11 biti dubultā, sēž starp zīmi un mantisu. Pludiņa formāts ir parādīts zemāk. Parakstzīmju bits tiek parādīts kā "s", eksponenta biti tiek parādīti kā "e", un mantissa biti tiek parādīti kā "m":

Java pludiņa bitu izkārtojums
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

Nulles zīmes bits norāda pozitīvu skaitli, bet viena zīmes bits - negatīvu skaitli. Mantīsa vienmēr tiek interpretēta kā pozitīvs divu skaitļu skaitlis. Tas nav divnieku papildinājuma skaitlis. Ja zīmes bits ir viens, peldošā komata vērtība ir negatīva, bet mantissa joprojām tiek interpretēta kā pozitīvs skaitlis, kas jāreizina ar -1.

Eksponenta lauku interpretē vienā no trim veidiem. Visu skaitļu eksponents norāda, ka peldošā komata skaitlim ir viena no īpašajām vērtībām plus vai mīnus bezgalība vai "nav skaitlis" (NaN). NaN ir noteiktu darbību rezultāts, piemēram, nulles dalīšana ar nulli. Visu nulļu eksponents norāda denormalizētu peldošā komata skaitli. Jebkurš cits eksponents norāda normalizētu peldošā komata skaitli.

Mantissa satur vēl vienu precizitātes bitu, izņemot tos, kas parādās mantisas gabalos. Pludiņa, kas aizņem tikai 23 bitus, mantisai ir 24 bitu precizitāte. Dubultu, kas aizņem 52 bitus, mantisai ir 53 bitu precizitāte. Nozīmīgākais mantissa bits ir paredzams, un tāpēc tas nav iekļauts, jo peldošā komata skaitļu eksponents JVM norāda, vai skaitlis ir normalizēts. Ja eksponents ir visas nulles, peldošā komata skaitlis tiek denormalizēts un zināms, ka nozīmīgākais mantisas bits ir nulle. Pretējā gadījumā peldošā komata skaitlis tiek normalizēts, un zināms, ka vissvarīgākais mantisas bits ir viens.

JVM neveido izņēmumus jebkādu peldošā komata operāciju rezultātā. Īpašas vērtības, piemēram, pozitīva un negatīva bezgalība vai NaN, tiek atgrieztas aizdomīgu darbību rezultātā, piemēram, dalīšana ar nulli. Visu eksponents norāda īpašu peldošā komata vērtību. Visu eksponents ar mantisu, kura biti ir visi nulle, norāda bezgalību. Bezgalības zīmi norāda zīmes bits. Visu eksponents ar jebkuru citu mantisu tiek interpretēts kā "nevis skaitlis" (NaN). JVM vienmēr ražo vienu un to pašu mantisu NaN, kas ir visas nulles, izņemot nozīmīgāko mantisas bitu, kas parādās skaitlī. Šīs vērtības ir norādītas zemāk esošajai pludiņam:

Īpašas peldošās vērtības
VērtībaPeldošie biti (zīme eksponenta mantissa)
+ Bezgalība0 11111111 00000000000000000000000
-Nenoteiktība1 11111111 00000000000000000000000
NaN1 11111111 10000000000000000000000

Eksponenti, kas nav ne visi, ne visas nulles, norāda divu spēku, ar kuru reizināt normalizēto mantisu. Divu jaudu var noteikt, interpretējot eksponenta bitus kā pozitīvu skaitli un pēc tam no pozitīvā skaitļa atņemot novirzi. Pludiņam novirze ir 126. Dubultam novirze ir 1023. Piemēram, eksponenta lauks pludiņā 00000001 dod divu jaudu, atņemot novirzi (126) no eksponenta lauka, kas interpretēts kā pozitīvs vesels skaitlis (1). Tāpēc divu jauda ir 1 - 126, kas ir -125. Tas ir mazākais iespējamais divu jauda pludiņam. Otrā galējībā 11111110 eksponenta lauks dod divu jaudu (254 - 126) vai 128. Skaitlis 128 ir lielākais no diviem jaudas lielums, kas pieejams pludiņam. Šajā tabulā ir parādīti vairāki normalizētu pludiņu piemēri:

Normalizētas peldošās vērtības
VērtībaPeldošie biti (zīme eksponenta mantissa)Neobjektīvs eksponents
Lielākais pozitīvais (ierobežotais) pludiņš0 11111110 11111111111111111111111128
Lielākais negatīvs (ierobežots) pludiņš1 11111110 11111111111111111111111128
Mazākais normalizētais pludiņš1 00000001 00000000000000000000000-125
Pi0 10000000 100100100001111110110112

Visu nulļu eksponents norāda, ka mantissa ir denormalizēta, kas nozīmē, ka nenorādītais vadošais bits ir nulle, nevis viens. Divu jauda šajā gadījumā ir tāda pati kā divu zemākā jauda, ​​kas pieejama normalizētai mantisai. Pludiņam tas ir -125. Tas nozīmē, ka normalizētām mantisām, kas reizinātas ar divām, paaugstinātām līdz -125, eksponenta lauks ir 00000001, savukārt denormalizētajām mantisām, kas reizinātas ar divām, paaugstinātām līdz -125, eksponenta lauks ir 00000000. Pielaide denormalizētiem skaitļiem apakšā eksponentu diapazona beigas atbalsta pakāpenisku nepietiekamu plūsmu. Ja tā vietā, lai attēlotu normalizētu skaitli, tiktu izmantots zemākais eksponents, lielākiem skaitļiem notiktu nepietiekama plūsma līdz nullei. Citiem vārdiem sakot, atstājot zemāko eksponentu denormalizētiem skaitļiem, var attēlot mazākus skaitļus. Mazākiem denormalizētajiem skaitļiem ir mazāks precizitātes bits nekā normalizētajiem skaitļiem, taču tas ir labāk, nekā zemu plūsmu līdz nullei, tiklīdz eksponents sasniedz minimālo normalizēto vērtību.

Denormalizētas peldošās vērtības
VērtībaPeldošie biti (zīme eksponenta mantissa)
Mazākā pozitīvā (nulle) pludiņa0 00000000 00000000000000000000001
Mazākā negatīvā (nav nulle) pludiņa1 00000000 00000000000000000000001
Lielākais denormalizētais pludiņš1 00000000 11111111111111111111111
Pozitīva nulle0 00000000 00000000000000000000000
Negatīva nulle1 00000000 00000000000000000000000

Atklāts pludiņš

Java pludiņš atklāj tā iekšējo būtību. Zemāk esošais sīklietotne ļauj jums spēlēt ar peldošā komata formātu. Pludiņa vērtība tiek parādīta vairākos formātos. Radix divu zinātnisko apzīmējumu formāts rāda mantisu un eksponentu desmit bāzē. Pirms parādīšanas faktiskā mantissa tiek reizināta ar 2 24, kas dod integrālu skaitli, un objektīvais eksponents tiek samazināts par 24. Pēc tam gan integrālo mantisu, gan eksponentu viegli pārvērš par bāzes desmit un parāda.

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