Hey Rick,
Ik heb een vreemd programmeer probleem in Processing.
Wanneer ik het volgende uitvoer krijg ik, naar mijn idee vreemde resultaten.
println(2.0/3.0); // -> 0.6666667
println(2.0-(2.0/3.0)-(2.0/3.0)); // -> 0.66666657
println(2.0-(2.0/3.0)-(2.0/3.0)-(2.0/3.0)); // -> -1.1920929E-7
println(2.0-(2.0/3.0)*3.0); // -> 0.0
Zo snap ik niet waarom 2.0-(2.0/3.0)-(2.0/3.0)-(2.0/3.0) niet hetzelfde is als 2.0-(2.0/3.0)*3.0.
Bijna vreemder vind ik nog dat hij zelfs naar minder dan -1 schiet.
Heb jij een idee?
Alvast bedankt,
Peter
—
Ha Peter,
Ik heb wel een verklaring. Een float wordt opgeslagen in 4 bytes. Hierdoor moet een breuk zoals 2/3 afgerond worden omdat het werkelijke getal 0.6666666666666666666666666666666666666666666…(plus nog eens oneindig veel zessen) niet zou passen.
Het feit dat 2.0/3.0 afgebeeld wordt als 0.666667 laat de afronding al zien. Maar als je met nf (number format) de float afbeeld zie dat ie nog een paar meer cijfers achter de comma heeft maar wel een beperkt aantal: println(nf(2.0/3.0,0,20)); = 0.66666668653488160000. Waarom ie het niet als 0.666666666666666666000000 opslaat weet ik. Dat zou in mijn beleving wel moeten kunnen…
Hieronder zie je iets beter wat er gebeurt.
float f = 2.0/3.0;
println(nf(f,0,40)); //0.6666666865348816000000000000000000000000
println(nf(f+f,0,40)); //1.3333333730697632000000000000000000000000
println(nf(f+f+f,0,40)); //2.0000000000000000000000000000000000000000
println();
println(nf(2.0+(-f-f-f),0,40)); //0.0000000000000000000000000000000000000000
println(nf(2.0-(f+f+f),0,40)); //0.0000000000000000000000000000000000000000
println(nf(2.0-f-f-f,0,40)); //-0.0000001192092895507812500000000000000000
Het gaat dus eigenlijk pas fout als je geen haakjes gebruikt. Als je eerst -f-f-f of f+f+f uitrekent en dat geheel van 2.0 aftrekt krijg je 0. Ga je ze 1 voor 1 van 2.0 aftrekken dan krijg je afrondingsfouten.
Jou opmerking over naar -1 schieten klopt niet helemaal: -1.1920929E-7 ligt niet in de buurt van -1 maar is een heel klein getal namelijk -0.0000001192092 alleen is bij deze notatie de comma 7 plaatsen verplaatst om het getal leesbaarder te maken (of dat help is maar de vraag, geef mij maar de 0.0000001192092 notatie.
Groetjes Rick
—
Thanks, erg leerzaam. Met deze info kan ik het probleem zeker oplossen.
Peter
Discussion