Intel 80386DX-suoritin ja erillinen 80387DX matematiikkasuoritin.
**Matematiikkasuoritin** (engl. *Floating Point Unit*, **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
-------

1. ↑  AMD Shifting to One Floating Point Unit Per Core Design with Upcoming Zen Processors – Dropping Shared Core Approach of Excavator *wccftech.com*. Viitattu 8.1.2017.
2. 1 2 3  3-arithmetic (PDF) *people.ee.duke.edu*. Viitattu 22.2.2023. (englanniksi)
3. ↑
4. ↑
5. ↑
6. ↑
7. ↑  Michael F. Cowlishaw: Decimal Floating-Point: Algorism for Computers (PDF) *speleotrove.com*. Viitattu 24.2.2023. (englanniksi)
8. 1 2 3 4  David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic  maaliskuu 1991.  Arkistoitu. Viitattu 24.2.2023. (englanniksi)
9. 1 2 3 4 5 6 7  Technical Summary HCMOS Enhanced Floating-Point Coprocessor (PDF) *datasheets.chipdb.org*. Viitattu 22.2.2023. (englanniksi)
10. ↑  Daniel Etiemble: Coprocessors: Failures and successes (PDF) *arxiv.org*.  25.7.2019. Viitattu 22.2.2023. (englanniksi)
11. 1 2 3  Motorola M68000 Family, Programmer’s Reference Manual (PDF) *nxp.com*. Viitattu 23.2.2023. (englanniksi)
12. ↑   (1992) *The SPARC Architecture Manual: Version 8*. SPARC International, Inc. Viitattu 2011-09-24.
13. ↑   (1994) *The SPARC Architecture Manual: Version 9*. SPARC International, Inc. Viitattu 2011-09-24.
14. ↑  GCC 6 Release Series *gcc.gnu.org*. Viitattu 8.1.2017.
15. ↑  Long Double *learn.microsoft.com*.  20.9.2016. Viitattu 24.2.2023. (englanniksi)
16. ↑  Building with 128-bit floating-point (long double) support for AArch64 state *developer.arm.com*. Viitattu 24.2.2023. (englanniksi)
17. ↑  FPU views of the register bank *developer.arm.com*. Viitattu 22.2.2023. (englanniksi)
18. 1 2  FPU instruction set *developer.arm.com*. Viitattu 22.2.2023. (englanniksi)
19. 1 2  Floating-Point Unit (PDF) *johnloomis.org*. Viitattu 22.2.2023. (englanniksi)
20. ↑  IEEE 754 standard implementation choices *developer.arm.com*. Viitattu 22.2.2023. (englanniksi)
21. ↑  IEEE 754 arithmetic and rounding *developer.arm.com*. Viitattu 25.4.2023. (englanniksi)
22. ↑  Floating Point Rounding Modes (PDF) *inst.eecs.berkeley.edu*.  2012. Viitattu 25.2.2023. (englanniksi)
23. ↑  B.1 Floating-Point Hardware
24. ↑  FAQABOSS: Frequently Asked Questions About Buying an Old (Used) Sun System

Aiheesta muualla
----------------

* Daniel Etiemble: Coprocessors: Failures and successes (PDF) *arxiv.org*.  25.7.2019. Viitattu 22.2.2023. (englanniksi)

Lisätietoja aiheesta**Matematiikkasuoritin**Wikipedian sisarhankkeissa

* Oppikirjoja Wikikirjastossa
* Kuvia Commonsissa

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