Programovanie

Aritmetika s pohyblivou rádovou čiarkou

Vitajte v ďalšej splátke produktu Pod kapotou. Tento stĺpec sa zameriava na to, aby vývojárom Java umožnil nahliadnuť do skrytej krásy pod ich spustenými programami Java. Stĺpec tohto mesiaca pokračuje v diskusii, ktorá sa začala minulý mesiac, o inštrukčnej sade bytových kódov virtuálneho stroja Java (JVM). Tento článok sa venuje aritmetike s pohyblivou rádovou čiarkou v prostredí JVM a venuje sa bajtovým kódom, ktoré vykonávajú aritmetické operácie s pohyblivou rádovou čiarkou. V nasledujúcich článkoch sa bude diskutovať o ďalších členoch rodiny bytecode.

Hlavné plávajúce body

Podpora pohyblivej rádovej čiarky JVM dodržiava štandard IEEE-754 1985 s pohyblivou rádovou čiarkou. Táto norma definuje formát 32-bitových a 64-bitových čísel s pohyblivou rádovou čiarkou a definuje operácie s týmito číslami. V JVM sa aritmetika s pohyblivou rádovou čiarkou vykonáva na 32-bitových plavákoch a 64-bitových dvojiciach. Pre každý bytecode, ktorý vykonáva aritmetiku na plavákoch, existuje zodpovedajúci bytecode, ktorý vykonáva rovnakú operáciu aj pri štvorhre.

Číslo s pohyblivou rádovou čiarkou má štyri časti - znamienko, mantisu, radix a exponent. Znamienko je buď 1 alebo -1. Mantisa, vždy kladné číslo, obsahuje významné číslice čísla s pohyblivou rádovou čiarkou. Exponent vyjadruje kladnú alebo zápornú mocnosť radixu, ktorou by sa mala mantisa a znamienko vynásobiť. Štyri komponenty sa kombinujú takto, aby sa získala hodnota s pohyblivou rádovou čiarkou:

znamienko * mantisa * exponent radixu

Čísla s pohyblivou rádovou čiarkou majú viacnásobné zastúpenie, pretože mantisu ľubovoľného čísla s pohyblivou rádovou čiarkou je možné kedykoľvek vynásobiť určitou silou radixu a zmeniť exponent tak, aby sme získali pôvodné číslo. Napríklad číslo -5 môže byť rovnako zastúpené ktoroukoľvek z nasledujúcich foriem v radix 10:

Formy -5
PodpísaťMantissaExponent Radixu
-15010 -1
-1510 0
-10.510 1
-10.0510 2

Pre každé číslo s pohyblivou rádovou čiarkou existuje jedno vyjadrenie, o ktorom sa hovorí, že je normalizované. Číslo s pohyblivou rádovou čiarkou je normalizované, ak je jeho mantisa v rozsahu definovanom týmto vzťahom:

1 / radix <= mantisa <

Normalizované číslo s pohyblivou rádovou čiarkou Radix 10 má desatinnú čiarku len naľavo od prvej nenulovej číslice v mantiske. Normalizovaná reprezentácia s pohyblivou rádovou čiarkou -5 je -1 * 0,5 * 10 1. Inými slovami, mantisa čísla s normalizovanou pohyblivou rádovou čiarkou nemá nenulové číslice naľavo od desatinnej čiarky a nenulovú číslicu iba na vpravo od desatinnej čiarky. Každé číslo s pohyblivou rádovou čiarkou, ktoré sa nezmestí do tejto kategórie, sa považuje za denormalizované. Číslo nula nemá normalizované zastúpenie, pretože nemá nenulovú číslicu umiestnenú vpravo od desatinnej čiarky. „Prečo sa normalizovať?“ je bežný výkričník medzi nulami.

Čísla s pohyblivou rádovou čiarkou v JVM používajú radix dvoch. Čísla s pohyblivou rádovou čiarkou v JVM majú preto nasledujúcu formu:

znamienko * mantisa * 2 exponent

Mantisa čísla s pohyblivou rádovou čiarkou v JVM je vyjadrená ako binárne číslo. Normalizovaná mantisa má svoju binárnu bodku (dva základné ekvivalenty desatinnej čiarky) len naľavo od najvýznamnejšej nenulovej číslice. Pretože binárny číselný systém má iba dve číslice - nulu a jednu - najvýznamnejšia číslica normalizovanej mantisy je vždy jedna.

Najvýznamnejším bitom plaváka alebo dvojníka je jeho znakový bit. Mantisa zaberá 23 najmenej významných bitov plaváka a 52 najmenej významných bitov dvojníka. Exponent, 8 bitov v plaváku a 11 bitov v dvojnásobku, je medzi znamienkom a mantisou. Formát plaváka je uvedený nižšie. Znakový bit je zobrazený ako „s“, bity exponenta sú zobrazené ako „e“ a mantisa bity sú zobrazené ako „m“:

Bitové rozloženie plaváka Java
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm

Znakový bit nula označuje kladné číslo a znamienkový bit jednej znamená záporné číslo. Mantisa sa vždy interpretuje ako kladné číslo dva. Nie je to číslo dvojčaťa. Ak je signálny bit jedna, hodnota s pohyblivou rádovou čiarkou je záporná, ale mantisa sa stále interpretuje ako kladné číslo, ktoré sa musí vynásobiť -1.

Pole exponenta sa interpretuje jedným z troch spôsobov. Exponent všetkých označuje, že číslo s pohyblivou rádovou čiarkou má jednu zo špeciálnych hodnôt plus alebo mínus nekonečno alebo „nie číslo“ (NaN). NaN je výsledkom určitých operácií, napríklad rozdelenia nuly na nulu. Exponent všetkých núl označuje denormalizované číslo s pohyblivou rádovou čiarkou. Akýkoľvek iný exponent označuje normalizované číslo s pohyblivou rádovou čiarkou.

Mantisa obsahuje ešte jeden kúsok presnosti nad rámec tých, ktoré sa vyskytujú v bitoch mantisy. Mantisa plaváka, ktorý zaberá iba 23 bitov, má presnosť 24 bitov. Mantisa dvojníka, ktorý zaberá 52 bitov, má presnosť 53 bitov. Najvýznamnejší bit mantisy je predvídateľný, a preto nie je zahrnutý, pretože exponent čísel s pohyblivou rádovou čiarkou v JVM naznačuje, či je počet normalizovaný alebo nie. Ak sú exponentom všetky nuly, číslo s pohyblivou rádovou čiarkou sa denormalizuje a je známe, že najvýznamnejším bitom mantisy je nula. V opačnom prípade je číslo s pohyblivou rádovou čiarkou normalizované a je známe, že najvýznamnejším bitom mantisy je jedna.

JVM nevyvoláva žiadne výnimky v dôsledku akýchkoľvek operácií s pohyblivou rádovou čiarkou. Špeciálne hodnoty, ako napríklad kladné a záporné nekonečno alebo NaN, sa vrátia v dôsledku podozrivých operácií, ako je napríklad delenie nulou. Exponent všetkých označuje špeciálnu hodnotu s pohyblivou rádovou čiarkou. Exponent všetkých s mantisou, ktorej všetky bity sú nulové, označuje nekonečno. Znak nekonečna je označený bitom znamienka. Exponent všetkých s inou mantisou sa interpretuje tak, že znamená „nie číslo“ (NaN). JVM vždy produkuje rovnakú mantisu pre NaN, čo sú všetky nuly okrem najvýznamnejšieho bitu mantisy, ktorý sa objavuje v čísle. Tieto hodnoty sú zobrazené pre plavák nižšie:

Špeciálne float hodnoty
HodnotaPlávajúce bity (mantisa znaku exponenta)
+ Nekonečno0 11111111 00000000000000000000000
-Nekonečno1 11111111 00000000000000000000000
NaN1 11111111 10000000000000000000000

Exponenti, ktorí nie sú všetci alebo všetky nuly, označujú silu dvoch, ktorou sa vynásobí normalizovaná mantisa. Sila dvoch sa dá určiť interpretáciou bitov exponenta ako kladného čísla a potom odčítaním odchýlky od kladného čísla. Pre plavák je predpätie 126. Pre dvojnásobok je predpätie 1023. Napríklad pole exponentu v plaváku 00000001 dáva mocninu dvoch odčítaním odchýlky (126) od poľa exponenta interpretovaného ako kladné celé číslo. (1). Sila dvoch je teda 1 - 126, čo je -125. Toto je najmenší možný výkon dvoch pre plavák. Na druhej strane extrém, pole exponenta 11111110 poskytuje mocninu dvoch (254 - 126) alebo 128. Číslo 128 je najväčšia mocnina z dvoch dostupných pre plavák. Niekoľko príkladov normalizovaných plavákov je uvedených v nasledujúcej tabuľke:

Normalizované pohyblivé hodnoty
HodnotaPlávajúce bity (mantisa znaku exponenta)Nestranný exponent
Najväčší pozitívny (konečný) plavák0 11111110 11111111111111111111111128
Najväčší záporný (konečný) plavák1 11111110 11111111111111111111111128
Najmenší normalizovaný plavák1 00000001 00000000000000000000000-125
Pi0 10000000 100100100001111110110112

Exponent všetkých núl naznačuje, že mantisa je denormalizovaná, čo znamená, že neuvádzaný vedúci bit je nula namiesto jednej. Sila dvoch je v tomto prípade rovnaká ako najmenšia sila z dvoch, ktorá je k dispozícii pre normalizovanú mantisu. Pre plavák je to -125. To znamená, že normalizované mantisy vynásobené dvoma zvýšenými na mocninu -125 majú pole exponentu 00000001, zatiaľ čo denormalizované mantisy vynásobené dvoma zvýšenými na mocninu -125 majú exponentové pole 00000000. Príspevok pre denormalizované čísla v dolnej časti koniec rozsahu exponentov podporuje postupné podtečenie. Ak by bol namiesto toho najmenší exponent použitý na vyjadrenie normalizovaného čísla, pri väčšom počte by došlo k podtečeniu na nulu. Inými slovami, ponechanie najnižšieho exponenta pre denormalizované čísla umožňuje reprezentáciu menších čísel. Menšie denormalizované čísla majú menej bitov presnosti ako normalizované čísla, ale je lepšie uprednostniť ich podtečenie na nulu, hneď ako exponent dosiahne svoju minimálnu normalizovanú hodnotu.

Denormalizované pohyblivé hodnoty
HodnotaPlávajúce bity (mantisa znaku exponenta)
Najmenší kladný (nenulový) plavák0 00000000 00000000000000000000001
Najmenší záporný (nenulový) plavák1 00000000 00000000000000000000001
Najväčší denormalizovaný plavák1 00000000 11111111111111111111111
Kladná nula0 00000000 00000000000000000000000
Záporná nula1 00000000 00000000000000000000000

Vystavený plavák

Jávsky plavák odhaľuje svoju vnútornú podstatu Nižšie uvedený applet vám umožňuje hrať sa s formátom s pohyblivou rádovou čiarkou. Hodnota plaváka je zobrazená v niekoľkých formátoch. Formát vedeckej notácie radix dva zobrazuje mantisu a exponent v základnej desiatke. Pred zobrazením sa skutočná mantisa vynásobí 2 24, čím sa získa celé číslo, a nestranný exponent sa zníži o 24. Integrálna mantisa aj exponent sa potom ľahko prevedú na základňu desať a zobrazia sa.

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