Liukuluku

Wikipedia
Loikkaa: valikkoon, hakuun

Liukuluku on tietokoneissa käytetty esitystapa reaaliluvuille. Liukulukuun kuuluu neljä osaa: etumerkki (s), mantissa (m), kantaluku (k) ja eksponentti (c). Etumerkki kertoo onko luku negatiivinen vai positiivinen. Mantissa kuvaa luvun merkitseviä numeroita. Kantaluku ja eksponentti määrittävät luvun suuruusluokan. Tällöin liukuluvun arvoksi x saadaan

x = (-1)^s m k^c.

Esitys ei kuitenkaan ole yksikäsitteinen lukunelikölle (s, m, k, c) ellei lukualueita rajata tarkasti. Yksikäsitteisyys voidaan saavuttaa sopimalla tietty kantaluku k, ja sen jälkeen vaatimalla, että \frac{1}{k} \le m < 1 ja c = \lfloor \log_k |x| \rfloor + 1. Tietokoneissa pätee yleensä k = 2, jolloin \frac{1}{2} \le m < 1 ja c = \lfloor \log_2 |x| \rfloor + 1.

Liukulukulaskenta voidaan toteuttaa ohjelmallisesti jos tietokoneen suoritin tukee vain kokonaislukujen laskutoimituksia, tai suoritin voi pystyä suoraan liukulukulaskentaan. Käyttäjälle tämä näkyy vain nopeuserona, ei tulosten erona. PC-yhteensopivat koneet ovat noin vuodesta 1995 saakka sisältäneet suorittimia, joissa liukulukulaskennan tekevä osa on samalla piisirulla. Tätä ennen PC-koneissa oli keskussuorittimen rinnalle ostettavissa erikseen matematiikkasuoritin.

Johdatteleva esimerkki[muokkaa | muokkaa wikitekstiä]

Oletetaan kantaluvun olevan 10, mantissan kolminumeroinen ja eksponentissa olevan etumerkin ja yhden numeron.

Tällöin suurin esitettävissä oleva luku on 999 \times 10^9. Alempana selitettävistä normaaleista luvuista pienin nollaa suurempi on 100 \times 10^{-9}, pienin epänormaali luku 001 \times 10^{-9}. Tarkkuus riippuu suuruusluokasta: välillä 1–10 luvut esitetään tuhannesosan tarkkuudella, välillä 10–100 sadasosan tarkkuudella ja niin edelleen.

Kullekin luvulle on kolme eri esitystapaa: esimerkiksi 1,23 voidaan esittää 123 \times 10^{-2}, 012 \times 10^{-1} tai 001 \times 10^0. Esitystavoista ensimmäinen on tarkin, ja tätä esitystapaa kutsutaan normaaliksi; siis normaalin luvun mantissa on aina vähintään 100 ja enintään 999.

Normaalit luvut muodostavat näin nollaa kohti tihentyvän parven, jossa kuitenkin nollan ympärillä on aukko: Pienin positiivinen luku on tuhat kertaa suurempi kuin sen erotus toiseksi pienimpään positiiviseen lukuun. Epänormaalit luvut täyttävät tämän aukon: tarkkuus pienenee, mutta laskenta ei "romahda" äkillisesti nollaan.

IEEE 754 -liukulukustandardi[muokkaa | muokkaa wikitekstiä]

IEEE 754 on yleisin tietokoneissa käytetty liukulukustandardi. Se olettaa kantaluvuksi k = 2. Etumerkki ilmoitetaan yhdellä bitillä. s = 0 tarkoittaa positiivista lukua, ja s = 1 tarkoittaa negatiivista. Mantissa ja eksponentti ovat etumerkittömiä bittijonoja. Standardi määrittelee neljä erilaista liukulukua:

  • Perustarkkuus (m on 23 bittiä ja c on 8 bittiä)
  • Kaksoistarkkuus (m on 52 bittiä ja c on 11 bittiä)
  • Laajennettu perustarkkuus (m on 31 bittiä ja c on 11 bittiä)
  • Laajennettu kaksoistarkkuus (m on 63 bittiä ja c on 15 bittiä)

Normalisoidut luvut[muokkaa | muokkaa wikitekstiä]

Kun c \ne 0, luku on normalisoitu. Tällöin yksikäsitteisyys saavutetaan sopimalla 1 \le m_{IEEE} < 2 ja c_{IEEE} = \lfloor \log_2 |x| \rfloor. Tällöin liukuluvun arvoksi x saadaan

x = (-1)^s m_{IEEE} 2^{c_{IEEE}}.

Lisäksi sovitaan, että m_{IEEE} = 1.m ja c_{IEEE} = c - b, missä b riippuu käytetystä tarkkuudesta. Perustarkkuudelle b = 127 ja kaksoistarkkuudella b = 1023.

Lukua nolla ei voi esittää suoraan johtuen m_{IEEE} määritelmästä, koska ylin bitti säädetään kiinteästi ykköseksi. Standardin mukaan luku on nolla kun m = c = 0. Tämän seurauksena luvun nolla esitys tietokoneen muistissa on kaikki bitit nollina, mikä nopeuttaa liukulukumuuttujien alustamista eräissä tietokonejärjestelmissä.

Ei-normalisoidut arvot[muokkaa | muokkaa wikitekstiä]

Kun c = 0 ja m \ne 0, luku ei ole normalisoitu. Tällöin m_{IEEE} = 0.m ja c_{IEEE} = b, missä b riippuu käytetystä tarkkuudesta. Perustarkkuudelle b = -126 ja kaksoistarkkuudella b = -1022.

Äärettömät: positiivinen ja negatiivinen[muokkaa | muokkaa wikitekstiä]

IEEE-745 määrittelee myös positiivisen ja negatiivisen äärettömän. Käsitteellisesti ne eivät vastaa niinkään matemaattista äärettömyyttä vaan mitä tahansa lukua, joka ylittää tai alittaa esitettävissä olevien lukujen alueen. Äärettömilläkin voidaan osittain laskea, esimerkiksi mikä tahansa positiivinen normaali luku jaettuna positiivisella äärettömällä antaa tulokseksi positiivisen nollan.

Nollat: positiivinen ja negatiivinen[muokkaa | muokkaa wikitekstiä]

Analogisesti äärettömien kanssa nollia on kaksi, positiivinen ja negatiivinen. Ne kuvaavat paitsi matemaattisen tarkkaa nollaa, myös lukuja joiden suuruus alittaa ei-normalisoitujen lukujenkin esitettävissä olevat arvot.

Epäluku ("Not-a-Number", NaN)[muokkaa | muokkaa wikitekstiä]

Lopuksi standardi määrittelee tuloksen laskutoimitukselle, jolle ei ole mielekästä vastausta edes äärettömien tai nollien avulla esitettynä. Esimerkiksi positiivisen ja negatiivisen äärettömän summa on tällainen: taustalla on ajatus, jonka mukaan emme tiedä kumpi ääretön on suurempi, joten mikään vastaus ei kelpaa. Jokaisen luvun jokainen laskutoimitus epäluvun kanssa tuottaa epäluvun: esimerkiksi epäluku kertaa nolla ei ole nolla vaan epäluku.

Epälukujen ja osittain myös äärettömien ja nollien avulla pitkä laskenta voidaan tehdä loppuun ja vasta lopuksi tutkia miltä osin saatiin mielekkäitä tuloksia ja milloin esimerkiksi jokin laskukaava ei toiminut.

Laskutaulukot[muokkaa | muokkaa wikitekstiä]

Seuraavassa "S" kuvaa suurta lukua, joka on lähes lukualueen ylärajalla, luku 3 on esimerkki tavallisesta luvusta, äärettömät on merkitty +inf ja −inf, nollat +0 ja −0, ja epäluku on NaN.

Yhteenlasku
+ 3 S +inf −inf +0 −0 NaN
3 6 S +inf −inf 3 3 NaN
S +inf +inf −inf S S NaN
+inf +inf NaN +inf +inf NaN
−inf −inf −inf −inf NaN
+0 +0 −0 NaN
−0 −0 Nan
NaN NaN

Ominaisuuksia[muokkaa | muokkaa wikitekstiä]

  • Kahta normalisoitua IEEE-754 lukua voi verrata suoraan käyttämällä kahden komplementin lukujen vertailijaa.

Esimerkki[muokkaa | muokkaa wikitekstiä]

Luvun 1 esitys perustarkkuudella tarkoittaa lukua, jossa m = 0 ja c = 127, eli heksadesimaalijonona: 3f80 0000. Sama luku kaksoistarkkuudella saa esitysmuodon: 3ff0 0000 0000 0000. Luvun -1 esitysmuoto perus- ja kaksoistarkkuudella on bf80 0000 ja bff0 0000 0000 0000.

Katso myös[muokkaa | muokkaa wikitekstiä]

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]

Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.