Kun desimaaliluvun muuttaa binääriluvuksi, niin usein binääriluvun esitykseksi tulee päättymätön ”desimaaliluku”. Esimerkiksi kahdeksan kymmenesosaa on desimaalilukuna 0,8 ja binäärilukuna 0.110011001100… Tämän vuoksi liukuluvuilla laskettaessa tulee väkisinkin pyöritysvirhettä.
Python ohjelmointikieli laskee liukuluvut 55 bitin tarkkuudella. Niinpä luku o.8 on binäärilukuna 0.1100110011001100110011001100110011001100110011001101. Kun tämän luvun muuntaa takaisin 10-järjestelmän luvuksi, niin saadaan 0.80000000000000004440892098500626161694526672363281.
Kun Pythonissa tulostaa luvun print-funktiolla, niin se oletuksena katkaisee 16 desimaalin tarkkuuteen, koneen muistissa luku kuitenkin on 55-bittisenä binäärilukuna. Alla Pythonin luvut 0.1, …, 0.9 60 desimaalin tarkkuudella.

Käytän seuraavissa esimerkeissä Ylioppilaslautakunnan Abittin Python-ohjelmaa. Sen mukana on ladattavissa Fractions ja Decimals -modulit.

Pythonin saa laskemaan tarkoilla arvoilla, kun muuntaa desimaaliluvut murtoluvuiksi Fraction-moduulin avulla.

Sama asia Decimals-moduulilla. Palaan tulevissa artikkeleissani tarkemmin näiden moduulien toimintaan.

Pitää muistaa, että pyöristysvirhettä voi tulla, kun lasketaan monimutkaisemmilla lausekkeilla.

Geogebra Classic 6:lla saa saman virheen näkymään Algebraikkunassa. Se laskee samalla tavoin väärin kuin Pythonkin. GeoGebran CAS laskee tarkoilla arvoilla, niinpä virhe ei toistu siellä. Vasemmalla GeoGebra 6:n Algebraikkuna, oikealla CAS.

Sama ominaisuus vaivaa Exceliä ja Google Sheetsiä.


Abittijärjestelmän Texas Nspire ja Speedcrunch tuottavat tästä esimerkistä oikean tuloksen.


Myös tulevassa Abitti 2:ssa majaileva Abicus-laskin osaa laskea tämän oikein.

Tosin Abicus-laskinta vaivaa sama ongelma kuin GeoGebraakin liittyen pieniin lukuihin.

lähteet
Colab-esimerkkitiedosto
https://colab.research.google.com/drive/1qWDsTciIpBBzKGp3O-9i0ETH3cv73iGY?usp=sharing
Floating-Point Arithmetic: Issues and Limitations virallisella Python sivustolla
https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues
Abitti 2 järjestelmän Abicus-laskin
https://digabi.github.io/abicus/

Jätä kommentti