Ubuntu 24.04.1 LTS | Lataa ja asenna | Tutustu yhteisöön | Blogi | Yritysten tarjoamat palvelutLiity Ubuntu Suomen seuraan muualla: Discourse, Facebook, Mastodon, Matrix, Telegram, X
$x = -0.2;$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';
-0.100.1
$x = -0.3;$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';
-0.2-0.12.77555756156E-170.1
Koodia: [Valitse]$x = -0.3;$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';$x += 0.1; print $x . '<br>';=>Koodia: [Valitse]-0.2-0.12.77555756156E-170.1Bugi PHP:ssä?
Ei, aivan normaalia toimintaa. Kuten huomaat, tuo nollan "sijasta" tulostuva luku on hyvin pieni (2,77*10^-17), eli käytännössä nolla. Pieni ero johtuu tietokoneen tavasta käsitellä liukulukuja, ja voit törmätä vastaaviin tapauksiin myös muita ohjelmointikieliä käyttäessäsi.
Jos käyttää kokonaislukumuuttujia, on nolla tietty nolla.
#include <iostream>int main() { float t=0.1; t-=0.1; t-=0.1; t-=0.1; t+=0.1; t+=0.1; std::cout << t << "\n"; return 0;}
$ ./testi -1.49012e-09
PHP:stä en ymmärrä onneksi yhtään mitään, enkä etenkään C++ höpinästä. Perlistä jotakin vähäsen...Mutta mitenkäs ohjelmoijapolo tarkistaa tuollaisen melkein nollan olemassaolon, toivotonta lähes lienee?
if (haluttutarkkuus+haettuluku>=vertailtavaluku && haluttutarkkuus-haettuluku<=vertailtavaluku) thentehdään haluttuend if
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> n = 0.1>>> n += 0.1>>> n0.20000000000000001>>> n += 0.1>>> n0.30000000000000004>>> n += 0.1>>> n0.40000000000000002>>>
Mutta mitenkäs ohjelmoijapolo tarkistaa tuollaisen melkein nollan olemassaolon, toivotonta lähes lienee?
Jos esimerkiksi luvun itseisarvo on pienempi kuin 10^-6, niin luku luultavasti on tasan nolla. Toki tilanteen mukaan soveltaen.
c Koe program koe real l l=0.1 write (*,*) l l=l+0.1 write (*,*) l l=l+0.1 write (*,*) l l=l+0.1 write (*,*) l l=l+0.1 write (*,*) l l=l+0.1 write (*,*) l stop end
0.100000001 0.200000003 0.300000012 0.400000006 0.5 0.600000024
Tulokseksi tulee:Koodia: [Valitse] 0.100000001 0.200000003 0.300000012 0.400000006 0.5 0.600000024(Huom. Jo lähtöarvossa on pieni heitto.)