Skip to content
This repository has been archived by the owner on Aug 5, 2024. It is now read-only.

Commit

Permalink
Clarifying floating point error explanations
Browse files Browse the repository at this point in the history
  • Loading branch information
swd1tn002 committed Nov 9, 2023
1 parent 8b1db51 commit 800e3cb
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 %)*
Expand Down
17 changes: 10 additions & 7 deletions rounding.md
Original file line number Diff line number Diff line change
@@ -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ä.*
>
Expand All @@ -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).

0 comments on commit 800e3cb

Please sign in to comment.