MIKKO RAHIKKA

The electrical things have their lives too, paltry as those lives are.


Pyöristysvirheistä Pythonissa ja GeoGebrassa

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.