Matematiikkasuoritin

**Matematiikkasuoritin** (, **FPU**) on tavallisen suorittimen CPU:n rinnalla toimiva yksikkö, jonka tehtävänä on laskea liukulukulaskutoimituksia. Matematiikkasuorittimet otettiin käyttöön, kun liukulukulaskutoimitusten suorittamisen tarve yleistyi. Mikroprosessorin tyypillisesti kokonaisluvuilla ja loogisilla operaatioilla operoivalla ALU-yksiköllä liukulukulaskenta oli liian hidasta.

Moderni moniydinsuoritin sisältää useita matematiikkasuoritinyksiköitä.

## Historia
Ennen liukulukuja ohjelmistot laskivat kiinteällä tarkkuudella tai skaalautumiskertoimella, joissa ongelmana oli valinta tarkkuuden ja arvoalueen välillä. Lisäksi laskutoimituksien hitaus oli ongelma.

Varhaiset suurtietokoneet kuten IBM 704 ja DECin PDP-6 toteuttivat liukulukulaskennan.

Kuitenkin henkilökohtaisissa- ja kotitietokoneissa matematiikkasuorittimet olivat aluksi erillisiä, varsinaisen suorittimen ulkopuolisia mikropiirejä ja valinnaisia. Myöhemmin matematiikkasuoritinten kustannukset laskivat niin paljon, että matematiikkasuoritin integroitiin samalle piisirulle ALU-yksikön rinnalle, jolloin erillisestä komponentista voitiin luopua. 

Jos tietokoneessa ei ole matematiikkasuoritinta (joko integroituna tai apusuorittimena), liukulukulaskutoimitukset joudutaan suorittamaan mikroprosessorin ALU-yksiköllä. Tämä on hitaampaa, sillä laskenta tapahtuu kokonaislukuina.
Tyypillinen tapa laskea trigonometrisiä tai hyperbolisia funktioita tai neliöjuurta ovat CORDIC- tai Jack E. Volderin algorithmit, jotka hän kehitti 1950-luvulla Convairilla B-58-pommikoneen navigointiajärjestelmää varten.

Intel i486 oli ensimmäinen Intelin suorittimesta, jossa matematiikkasuoritin lisättiin suorittimen kanssa samalle piisirulle. Siitä oli olemassa myös halvempi i486SX versio ilman tätä toiminnallisuutta.

Motorola 68040 -suorittimesta oli samaan aikaan myös halvempi 68LC040 versio, jossa ei ollut mukana matematiikkasuoritinta.

Sulautetut järjestelmät vielä usein käyttävät suorittimia, joissa ei ole matematiikkasuoritinta.

## Tekniikka

Matematiikkasuorittimet laskevat liukuluvuilla.
Liukuluvut ovat käytetty reaalilukujen likimääräinen esitysmuoto tietokoneella. Ne on toteutettu formaatilla, jossa mantissa esittää luvun tarkkuuttaa ja eksponentti sen suuruusluokan. Liukuluvulle varataan tietty määrä bittejä, jotka määrittävät sen tarkkuuden ja suurimman tallennettavan luvun.

Suorittimissa käytetään yleisesti IEEE-754 standardin mukaisia dataformaattia, mutta muitakin muotoja on kehitetty ja ohjelmallisesti (ilman laitteistotukea) voidaan käyttää muitakin muotoja eri tarkoituksiin.

Suorittimet tukevat normaalisti mallista riippuen yksinkertaisen, kaksinkertaisen tai laajennetun tarkkuuden liukulukuja (*single*, *double*, *single-extended* ja *double-extended*). Liukuluvulle usein varataan yksi tai kaksi 32-bittistä sanaa, jolloin ne ovat 32- tai 64-bittiä, tai voidaan käyttää laajennettua 80-bittistä muotoa, jolloin varataan kolme 32-bittistä sanaa (96-bittiä). Matematiikkasuoritin voi toimia sisäisesti 80-bittisesti, joka tukee yksinkertaista ja kaksinkertaista tarkkuutta. Matematiikkasuorittimet voivat tukea myös muita tietotyyppejä, esimerkiksi eri kokoisia kokonaislukuja ja BCD-koodattuja lukuja. Operandit voidaan muuttaa sisäisesti käytettyyn laajennetun tarkkuuden muotoon (80-bittinen) ennen käyttämistä laskennassa tai sijoittamista rekisteriin.

128-bittiselle IEEE-standardin mukaiselle liukulukuformaatille on määritelty tuki eräiden prosessoriarkkitehtuurien käskykannoissa (SPARC V8 ja V9
, PowerPC64).

Eräät ohjelmointikielen kääntäjät ja ajonaikaiset kirjastot eivät tue laajennettuja tarkkuuksia vaikka kohdelaitteistossa tuki olisi.

Grafiikkasuorittimet tukevat usein myös pienempää 16-bittistä *half-precision* formaattia, jolla säästetään muistikapasiteettia. Myös tietyt dataformaatit kuten ILM:n OpenEXR tukevat *half-precision* formaattia.

Matematiikkasuorittimella on tyypillisesti omat rekisterit ja oma käskykanta. Rekisterit ovat erilliset myös kun matematiikkasuoritin on integroitu pääsuorittimen kanssa samalle piirille.
Esimerkkejä matematiikkasuorittimen peruskäskyistä ovat yhteen- ja vähennyslasku, kerto- ja jakolasku, sekä neliöjuuri ja muunnokset eri tarkkuuksiin. Myös logaritmien ja trigonometristen funktioiden laskemiseen voi olla useita käskyjä.

Epälukujen (NaN, "Not-a-Number") ja pyöristysten käsittely on keskeinen osa liukulukujen käsittelyä. Epälukuja on kahta tyyppiä: SNaN (Signaling NAN) ja QNaN (Quiet NAN). SNaN nostaa poikkeuksen kun taas QNaN sallitaan ilman poikkeusta. IEEE:n standardin mukaan on neljä pyöristysmoodia: lähimpään, katkaisu (kohti nollaa), alaspäin (kohti negatiivista ääretöntä) ja ylöspäin (kohti positiivista ääretöntä). Oletuksena pyöristys tehdään lähimpään. 
Ulkoisena apusuorittimena käytettäessä pääsuoritin voi tukea toimintaa siten, että molemmat näkyvät ohjelmoijalle yhtenä suorittimena.

## Matematiikkasuorittimia

Seuraavia matematiikkasuorittimia on käytetty ennen vastaavan yksikön integraatiota CPU:n piirille:
* Intel 80387
* Motorola 68881 ja 68882
* Weitek 3167, Weitek 3170
* TI TMS390C601A

## Katso myös
* Suoritin
* Apusuoritin
* Vektorisuoritin

## Lähteet

## Aiheesta muualla
* 

* Englanninkielisen Wikipedian artikkeli 
* Half-precision floating-point format 
* Single-precision floating-point format 
* Double-precision floating-point format 
* Quadruple-precision floating-point format