From 800e3cb4125f672d955076e52b421cd9bc865a0c Mon Sep 17 00:00:00 2001 From: Teemu H <44917122+swd1tn002@users.noreply.github.com> Date: Thu, 9 Nov 2023 10:49:54 +0200 Subject: [PATCH] Clarifying floating point error explanations --- readme.md | 2 +- rounding.md | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/readme.md b/readme.md index 29c244e..27ea5a6 100644 --- a/readme.md +++ b/readme.md @@ -79,7 +79,7 @@ Voit suorittaa testisi joko koodieditorisi testaustyökalulla ([VS Code](https:/ ⛔ *Et saa tehdän lainkaan muutoksia `PriceFormatter`-luokkaan.* -💡 *Jos käytätte testeissänne lukuja, joka asettuvat tasan sadasosien "puoliväliin", saatatte törmätä liukulukujen rajallista tarkkuutta koskeviin ongelmiin. Ongelma ei johdu omasta koodistanne, testattavasta koodista eikä Javasta, vaan siitä, miten tietokoneet käsittelevät numeroita. Tarkempi selitys ongelmasta löytyy tämän repositorion tiedostosta [rounding.md](./rounding.md) tai artikkelista ["What Every Computer Scientist Should Know About Floating-Point Arithmetic" (oracle.com)](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).* +💡 *Jos käytät testeissäsi lukuja, joka asettuvat tasan sadasosien "puoliväliin", saatat törmätä liukulukujen rajallista tarkkuutta koskeviin ongelmiin. Ongelma ei johdu Javasta eikä omasta tai testattavasta koodista, vaan siitä, miten tietokoneet käsittelevät desimaaliosia. Tarkempi selitys aiheesta löytyy tämän repositorion tiedostosta [rounding.md](./rounding.md) tai artikkelista ["What Every Computer Scientist Should Know About Floating-Point Arithmetic" (oracle.com)](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).* ### Osa 2: kattavampi testaus *(soveltaminen, 5 * 15 %)* diff --git a/rounding.md b/rounding.md index c785e23..061767e 100644 --- a/rounding.md +++ b/rounding.md @@ -1,8 +1,8 @@ -# Liukulukujen epätarkkuus yksikkötestaustehtävän pyöristyksissä +# Liukulukujen epätarkkuus -Tehtävää tehdessänne saatatte törmätä erikoiseen tilanteeseen, jossa testattava luku näyttää pyöristyvän väärin toimivaksi oletetussa `formatPrice`-metodissa. Näin saattaa käydä erityisesti silloin, kun käytätte testissänne lukua, joka asettuu tasan sadasosien "puoliväliin". +Tämän repositorion tehtävää tehdessäsi saatat törmätä erikoiseen tilanteeseen, jossa testattava luku näyttää pyöristyvän väärin. Näin saattaa käydä erityisesti silloin, kun käytät testissäsi lukua, joka asettuu tasan sadasosien "puoliväliin", esim. `0,005`. -Ongelma ei johdu omasta koodistanne, testattavasta metodista eikä Javasta, vaan siitä, miten tietokoneet käsittelevät numeroita. ChatGPT selittää asian erittäin selkeästi, joten tässä sen tuottama selitys ilmiöstä: +Se, että luvun desimaaliosassa 5 pyöristyy tietyissä tapauksissa alaspäin, ei johdu Javasta, testistä eikä testattavasta koodista, vaan siitä, miten tietokoneet käsittelevät numeroita. ChatGPT selittää asian erittäin selkeästi, joten tässä sen tuottama selitys ilmiöstä: > *Tietokoneet käyttävät liukulukulogiikkaa tallentaakseen ja käsitelläkseen desimaalilukuja. Tämä logiikka käyttää binäärijärjestelmää, joka koostuu nollista ja ykkösistä. Tämä aiheuttaa tiettyjä tarkkuusongelmia desimaalilukujen käsittelyssä.* > @@ -14,13 +14,16 @@ Ongelma ei johdu omasta koodistanne, testattavasta metodista eikä Javasta, vaan > > ChatGPT (GPT-3.5). https://chat.openai.com/. 8.11.2023 -Ongelmaa voidaan havainnollistaa esimerkiksi ottamalla luvusta `123_456.555` jakojäännös ykkösen kanssa. Tuloksen voisi olettaa olevan `0.555`, mutta näin ei aivan ole: +Ongelmaa voidaan havainnollistaa esimerkiksi lasekemalla yhteen `0.1 + 0.2` tai ottamalla luvusta `123_456.555` jakojäännös ykkösen kanssa. Tuloksina voisi olettaa olevan `0.3` ja `0.555`, mutta näin ei aivan ole: ```java -System.out.println(123_456.555 % 1); // pitäisi tulostaa 0.555 +System.out.println(0.1 + 0.2); // pitäisi tulostaa 0.3 +0.30000000000000004 + +System.out.println(123_456.555 % 1); // pitäisi tulostaa 0.555 0.5549999999930151 ``` -Ratkaisuna liukulukujen epätarkkuuden aiheuttamien ongelmien välttämiseksi, että käytätte hieman sadasosien puolivälistä poikkeavia lukuja testeissänne. Tätä tarkkuusongelmaa ei tapahdu tässä tehtävässä tarkoituksella, vaan se sattuu olemaan vain luonnollinen osa tietokoneen toimintaa. +Ratkaisuna liukulukujen epätarkkuuden aiheuttamien ongelmien välttämiseksi suosittelen, että käytät hieman sadasosien puolivälistä poikkeavia lukuja testeissäsi. Tätä tarkkuusongelmaa ei tapahdu tässä tehtävässä tarkoituksella, vaan se sattuu olemaan vain luonnollinen osa tietokoneen toimintaa. -Voitte lukea tarkemmin liukulukujen teknisestä toteutuksesta sekä niiden rajoitteista artikkelista ["What Every Computer Scientist Should Know About Floating-Point Arithmetic" (oracle.com)](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). +Voit lukea tarkemmin liukulukujen teknisestä toteutuksesta sekä niiden rajoitteista artikkelista ["What Every Computer Scientist Should Know About Floating-Point Arithmetic" (oracle.com)](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).