Liukuluvut

Selitys

Etumerkki on , eli luku on .

Tässä on etumerkin jälkeen pelkkiä nollia, eli luku on , koska liukulukustandardissa on myös määritelty negatiivinen 0.
Koska eksponentti on pelkkiä ykkösiä, tämä tulkitaan poikkeustapauksena. Koska mantissa = 0, tämä luku on eli negatiivinen ääretön.
Koska eksponentti on pelkkiä ykkösiä, mutta mantissa ei ole 0, tämä luku on NaN, eli epäluku (Not a Number). Se ei siis ole mikään luku.
Eksponentti ei ole 0, eli kyseessä on normaali luku. Eksponentti on 1, mutta siitä vähennetään poikkeama , jolloin todellinen eksponentti on .

Koska luku on normaali luku, mantissan alkuun lisätään 1.

Lopullinen luku on siis .
Eksponentti on 0, eli kyseessä on subnormaali tai epänormaali luku. Normaalin luvun tapauksessa eksponentin arvosta vähennettäisiin poikkeama , jolloin eksponentti olisi .

Epänormaalin luvun tapauksessa valitaan poikkeuksellisesti sama eksponentti, kuin pienimmän mahdollisen normaalin luvun eksponentti, eli -126

Lopullinen luku on siis

Liukuluvut

Liukuluvun tarkoitus on esittää desimaalilukuja siten, että lukualue kattaa yhtä aikaa sekä todella suuria lukuja, että todella pieniä lukuja. Nimitys liukuluku (engl. floating point number) tulee siitä, että desimaalierotin ei ole binääriluvussa missään tietyssä kohdassa, vaan sen voi ajatella liukuvan tai “kelluvan” eri kohtiin.

Poikkeama

Eksponentti on binääriluku, joka voidaan tulkita esimerkiksi positiivisena kokonaislukuna. Esimerkiksi 8-bitin eksponentissa mahdolliset arvot ovat välillä 0000000-1111111, eli desimaalilukuna välillä 0-255. Jotta voidaan käyttää myös negatiivisia lukuja, vähennetään kokonaisluvusta \(2⁸-1\) eli 127, jolloin todellinen eksponentti siirtyy -127 ja 128 välille. Molemmilla ääripäillä on kuitenkin erityismerkitys.

Tämä tunnetaan excess-notaationa. Verrattuna normaaliin binäärilukujen kahden komplementtimuotoon, excess-notaatio säilyttää lukujen keskinäisen järjestyksen samalla tavalla sekä binäärimuodossa, että desimaaliksi muunnettuna. Tällöin eksponenttien suuruutta voi vertailla yksinkertaisesti tutkimalla, kumpi binääriluvuista on absoluuttisesti suurempi.

Normaalit luvut

Kun ajatellaan mitä tahansa binäärilukua, sen vasemmanpuoleisin (merkitsevä) luku on aina 1. Etunollat eivät merkitse, eli esimerkiksi 00001001 ja 1001 ovat täsmälleen sama luku. Ensimmäinen vasemmanpuoleisin luku on siis aina 1. Liukuluvut hyödyntävät tätä tietoa siten, että lukua 1 ei tallenneta mihinkään ja näin säästetään 1 bitti tallennustilaa muuhun käyttöön. Normaalimuoto tarkoittaa sitä, että luku tallennetaan siirtämällä piste siten, että se on juurikin reunimmaisen ykkösen jälkeen. Pistettä siirretään kertomalla tai jakamalla luvulla 2 (samaan tapaan kuin 10-järjestelmässä siirretään pistettä kertomalla tai jakamalla luvulla 10). Tarkastellaan esimerkkiä.

Luku 9 on binäärilukuna 1001. Selvyyden vuoksi merkataan molempiin desimaalierotin: 9.0 on siis binäärilukuna 1001.0. Jotta saamme pisteen reunimmaisen ykkösen kohdalle, sitä pitää siirtää kolmesti:

1001.0
 100.10
  10.010
   1.0010

Jakolasku tehtiin kolmesti, joten takaisin päästään kertomalla kolmesti: 2·2·2 = 23.

Luku on nyt normaalimuodossa. Tallennamme desimaalipisteen jälkeisistä luvuista ne, jotka mahtuvat ja pois leikkautuvilla nollilla ei onneksi ole merkitystä. Käytetään esimerkkinä 8 bittistä liukulukua, jossa eksponentti käyttää 4 bittiä ja mantissa 3. Eksponentin poikkeama on 7, eli tallennamme 3+7=10 joka on binäärimuodossa 1010. Tallennamme siis eksponentiksi 1010 ja mantissaksi 001. Luku on positiivinen, joten etumerkki on 0. Lopullinen liukuluku koodataan siis muodossa 01010001.

Subnormaalit luvut

Subnormaalit luvut ovat pienempiä lukuja, kuin pienin normaaliluku.

Pienin normaaliluku on se, jossa eksponentti on pienin mahdollinen, eli 8 bitin tapauksessa -6. Vaikka mantissan jättää nollaksi, eteen lisättävä ykkönen tarkoittaa, että kertoimena tulee olemaan 1.000. Kun tämä jaetaan luvulla 2 yhteensä 6 kertaa, saadaan luku:

0.000001

Tämä on siis binääriluku, joka edustaa lukua 1/64 ja se on 8 bittisen liukuluvun pienin normaaliluku.

Olisi mahdollista tulkita eksponentti siten, että kun se on nolla, eksponentiksi lasketaankin 0-7=-7. Tällöin päästäisiin aiemmasta vielä askeleen verran pienemmäksi jakamalla luku vielä kerran kahdella, eli päästäisiin lukuun 1/128.

Kuitenkaan eksponenttia -7 ei käytetä. Sen sijaan poikkeustapauksessa, jossa eksponenttibitit ovat nollia, pidetään eksponenttina -6, mutta jätetään implisiittinen 1 pois mantissasta. Nyt mahdolistuu huomattavasti pienempien lukujen tallentaminen. Jos asetetaan ainoastaan reunimmainen bitti ykköseksi, mantissan arvo onkin 0.001 (implisiittisen 1 tilalla onkin 0). Eksponenttina on edelleen -6, eli tämä luku jaetaan kahdella, 6 kertaa:

0.001
0.0001
0.00001
0.000001
0.0000001
0.00000001
0.000000001

Tämä luku onkin 1/512.

Yhteenvetona, subnormaalit luvut ovat sellaisia lukuja, joissa mantissan eteen ei lisätä ykköstä, mutta eksponenttina pidetään samaa kuin pienimmässä normaaliluvussa. Tästä on se hyöty, että pystytään tallentamaan huomattavasti pienempiä lukuja nollan lähettyvillä. Lukuja ei silti pystytä tallentamaan sen enempää. On vain tehty valinta. Voitaisiin tallentaa pelkkiä normaalilukuja 7 kappaletta lukuja 1/64 ja 1/128 väliltä, 1/1024 kokoisin askelein. Sen sijaan tallennetaan 7 kappaletta subnormaalilukuja, 1/64 ja 1/512 väliltä, 1/512 kokoisin askelein.

Kaikki 8-bittiset luvut

linkki