$x = -0.2;
$x += 0.1; print $x . '<br>';
$x += 0.1; print $x . '<br>';
$x += 0.1; print $x . '<br>';
=>-0.1
0
0.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.1
2.77555756156E-17
0.1
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.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.2Bugi PHP:ssä?
-0.1
2.77555756156E-17
0.1
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.Kyllä tuo minusta on bugi, koska nolla pitää aina olla täsmälleen 0.
Jos käyttää kokonaislukumuuttujia, on nolla tietty nolla.Niin tietty on, mutta ihan täsmälleen tuon jäsen samjan koodin mukaan tein saman Perlillä, ja tulos on tasan 0.
#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;
}
ja tulostaa$ ./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) then
tehdään haluttu
end 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 linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> n = 0.1
>>> n += 0.1
>>> n
0.20000000000000001
>>> n += 0.1
>>> n
0.30000000000000004
>>> n += 0.1
>>> n
0.40000000000000002
>>>
Mutta mitenkäs ohjelmoijapolo tarkistaa tuollaisen melkein nollan olemassaolon, toivotonta lähes lienee?
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.
Jos esimerkiksi luvun itseisarvo on pienempi kuin 10^-6, niin luku luultavasti on tasan nolla. Toki tilanteen mukaan soveltaen.Kummallista minusta, ja onneksi myös Perlin mielestä. ;)
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.)
| $x = $x1; $xs[] = array(); $ys[] = array(); while ($x <= $x2) { $x += $inc; $xs[] = $x; $ys[] = $polynomi->value($x); } | => => => => => => | $xs[] = array(); $ys[] = array(); for ($x = $x1, $n = 0; $x <= $x2; ++$n) { $x = $x1 + $n * $inc; $xs[] = $x; $ys[] = $polynomi->value($x); } |