Binääriset reaaliluvut on tallennettava tietokoneeseen erityisellä tavalla. Tietokoneet esittävät numerot binäärisinä kokonaislukuina (kokonaisluvut, jotka ovat kahden potensseja), joten ne eivät voi suoraan esittää muita kuin kokonaislukuja, kuten desimaalilukuja, koska radix-pistettä ei ole. Yksi tapa, jolla tietokoneet kiertävät tämän ongelman, on liukulukujen esittäminen, jossa "liukuluku" viittaa siihen, että radix-piste voi siirtyä ylös- tai alaspäin, kun se kerrotaan eksponentilla (potenssilla).


 

Laajentaen: liukulukuesityksessä luku tallennetaan yleensä kolmessa osassa: etumerkki, eksponentti ja signifikaandi (joskus kutsutaan mantissaksi). Tavallisin standardi on IEEE 754, jota useimmat modernit kielet ja alustat noudattavat. Perusperiaate on seuraava:

Perusrakenne

  • Etumerkki (sign): yksi bitti kertoo, onko luku positiivinen vai negatiivinen.
  • Eksponentti: joukko bittejä, joka ilmaisee kymmenien sijaan binäärisen siirron eli kuinka monta kertaa radix (kaksi) korotetaan. Eksponentti tallennetaan usein ns. bias-arvolla (siirretty arvo), jotta negatiiviset eksponentit saadaan edustettua.
  • Signifikaandi (mantissa): kertoo luvun tarkat binääritarkat merkit. Normalisoiduissa luvuissa johtava bitti on oletettu 1 eikä sitä tallenneta erikseen ("implicit leading 1").

IEEE 754 -esimerkkejä

  • Single (32-bittiä): 1 bitti signille, 8 bittiä eksponentille, 23 bittiä fraction (signifikaandin tallennettu osa). Totta merkittävyysbittien määrä on 24 (sisältää implisiittisen 1). Antaa noin 7 desimaalin tarkkuuden.
  • Double (64-bittiä): 1 bitti signille, 11 bittiä eksponentille, 52 bittiä fraction. Totta merkittävyysbittien määrä on 53. Antaa noin 15–17 desimaalin tarkkuuden.

Arvon laskukaava

Normaalille (normalisoidulle) liukuluvulle arvo lasketaan kaavalla:

arvo = (−1)^s × 1.f × 2^(e − bias)

Missä s on etumerkki, f on fraction-kentän binääripilkku (esim. .101...), e on tallennettu eksponentti ja bias on eksponentin siirtoarvo (esim. single: bias = 127, double: bias = 1023).

Erikoistapaukset

  • Nolla: eksponentti = 0 ja fraction = 0. IEEE 754 erottaa +0 ja −0, vaikka ne yleensä käyttäytyvät samankaltaisesti aritmetiikassa.
  • Subnormaalit (denormaalit): eksponentti = 0 ja fraction ≠ 0. Näillä voidaan edustaa hyvin pieniä lukuja lähempänä nollaa, mutta ilman johtavaa 1:stä (arvo = (−1)^s × 0.f × 2^(1 − bias)).
  • Inf (ääretön): eksponentti kaikki 1 ja fraction = 0 → positiivinen tai negatiivinen ääretön riippuen etumerkistä.
  • NaN (Not a Number): eksponentti kaikki 1 ja fraction ≠ 0 → epämääräinen/virhearvo, esim. 0/0 tai epäkelpo operaatio.

Tarkkuus ja rajoitukset

  • Monet desimaaliluvut eivät ole tarkasti esitettävissä binäärissä. Esimerkiksi 0.1 desimaalina on toistuva binäärijakso (0.0001100110011...), joten se tallennetaan likimääräisenä arvoa lähellä olevaan binäärimuotoon.
  • Pienet pyöristysvirheet kertyvät aritmetiikassa; näet eroja etenkin monissa summaus- tai toistuvissa laskutoimituksissa.
  • Vertailu suoraan equality (==) on epäluotettava liukuluvuilla — käytä erotuksen absoluuttia arvoa ja hyväksyttyä epsilon-arvoa tai muita algoritmeja (esim. suhteellinen virheraja).

Pyöristys, ylivuoto ja alivuoto

  • Pyöristys: IEEE 754 määrittelee useita pyöristysmoodia (round to nearest, toward zero, toward +inf, toward −inf). Usein käytössä on "round to nearest, ties to even".
  • Ylivuoto (overflow): kun laskun tulos on suurempi kuin suurin edustettavissa oleva arvo → usein arvo muuttuu ±Inf:ksi.
  • Alivuoto (underflow): hyvin lähellä nollaa olevat tulokset voivat muuttua subnormaaleiksi tai nollaksi, mikä johtaa menetykseen tarkkuudessa.

Käytännön huomioita ja hyviä käytäntöjä

  • Käytä oikeaa tarkkuutta: rahan käsittelyssä suositaan usein desimaalitietotyyppejä (decimal) tai kokonaislukupohjaista esitystä (esim. sentteinä), ei doublea suoraan.
  • Vältä suoraa vertailua liukuluvuissa; käytä epsilon-vertailua tai muuta soveltuvaa normia.
  • Jos tarvitset numeerisesti stabiileja summauksia, harkitse Kahanin summamenetelmää tai muita tarkkuutta parantavia algoritmeja.
  • Tarkenna tulostusmuotoilua, jotta et tulosta liikaa merkkejä, jotka vain paljastavat esityksen likiarvon hienovaraisuuden.

Yhteenveto

Liukulukuesitys antaa tehokkaan ja laajasti käytetyn tavan edustaa reaalilukuja tietokoneissa, mutta se ei ole eksakti desimaalien kannalta. On tärkeää ymmärtää eksponentin ja signifikaandin roolit, pyöristysvaikutukset sekä erikoistapaukset (NaN, Inf, subnormaalit) suunniteltaessa numerisia algoritmeja tai käsiteltäessä arkirahoja ja tieteellisiä laskelmia.