Forum » Programiranje » C++ double _1.0000imavrednost0.99999
C++ double _1.0000imavrednost0.99999
twom ::
Visual C++ 2008 Express, Win 7 64b
Iz konfiguracijske datoteke preberem neko vrednost (getprofilestring).
Namesto 18.90000 ima vrednost 18.899999 (Debug mode, Watch window)
Mm...
Lp,
Peter
Iz konfiguracijske datoteke preberem neko vrednost (getprofilestring).
Namesto 18.90000 ima vrednost 18.899999 (Debug mode, Watch window)
Mm...
Lp,
Peter
twom ::
char value[128]; char tempDefVal[15]; sprintf(tempDefVal, "%f", defaultValue); getProfileString(sectionName, valueName, tempDefVal, value, 128, iniFileName.c_str()); double retVal = atof(value);
value: "18.9 ; tekst"
retVal: 18.8999999
Zakaj?
HairyFotr ::
Za točno predstavitev realnih števil v računalniku bi potrebovali neskončno natančnost, ki pa je nimamo.. ker je pa zapis binaren, te včasih lahko preseneti, da se kakega v desetiškem zapisu preprostega števila ne da lepo predstavit.
Sicer pa premisli, koliko decimalk tega števila res rabiš in zaokroži in enako, ko preverjaš enakost dveh števil.
Sicer pa premisli, koliko decimalk tega števila res rabiš in zaokroži in enako, ko preverjaš enakost dveh števil.
twom ::
double retVal = atof(value);
spremenljivka value je tipa char dolžine 128 in ima vsebino "18.9 ; tekst\0"
atof dodeli spremenljivki double retVal vrednost 18.899999, zakaj ne 18.9000
Lp,
Peter
twom ::
Še vseeno mi ni jasno zakaj števila 18.9 ne zapiše kot
189000000000000000000000000000000000000000000000000000 * E-52
ampak
188999999999999999999999999999999999999999999999999999 * E-52
Lp
189000000000000000000000000000000000000000000000000000 * E-52
ampak
188999999999999999999999999999999999999999999999999999 * E-52
Lp
Pegaz ::
Ker imajo števila določeno omejitev pri velikosti in nimamo neskončno rama.
By the way, tudi v v decimalnem sistemu ne moreš nekaterih števil napisati s končno dolgim zapisom (npr. 1/3). Napišeš 0.333333333333, ampak žrtvuješ nekaj natančnosti.
By the way, tudi v v decimalnem sistemu ne moreš nekaterih števil napisati s končno dolgim zapisom (npr. 1/3). Napišeš 0.333333333333, ampak žrtvuješ nekaj natančnosti.
Mavrik ::
peter_nn: Ker zapisuje v binarnem formatu ne desetiškem. Probaj tisto tvoje zapisat v IEEE754 :)
The truth is rarely pure and never simple.
twom ::
overlord_tm ::
Pa saj ni tako grozno, samo ne mores primerjati enakosti, ampak primerjas ce sta si stevili za nek epsilon blizu, kjer je epislon napaka, ki se ti zdi se sprejemljiva.
talmai ::
Pri srednješolski matematiki učijo, da je 1.9999999999... (v neskončnost, torej 1.9 s tisto črto nad devetko) enako 2.0, tako da je stvar praktično samo v zapisu (napaka pri floatu pa zanemarljiva, oziroma odvisno od natančnosti, ki jo želiš, to je ta epsilon, o katerem so ti že povedali).
Sicer pa, ko se računa z denarjem, na primer, pogosto shranjujemo zneske kot integer, pomnožen s sto. Recimo, ko vidiš v spletni trgovini znesek 9.87 je to zadaj v bistvu integer 987 v centih (na tak način se izogneš seštevanju minimalnih napak - to lahko dela probleme, če sešteješ/zmnožiš veliko floatov skupaj). Preden prikažeš tako število, pa izračunaš cel deljitel s 100 (9) in ostanek (87).
Sicer pa, ko se računa z denarjem, na primer, pogosto shranjujemo zneske kot integer, pomnožen s sto. Recimo, ko vidiš v spletni trgovini znesek 9.87 je to zadaj v bistvu integer 987 v centih (na tak način se izogneš seštevanju minimalnih napak - to lahko dela probleme, če sešteješ/zmnožiš veliko floatov skupaj). Preden prikažeš tako število, pa izračunaš cel deljitel s 100 (9) in ostanek (87).
"Bit je kot določna popolnoma nedoločna." (M. Heidegger)
Spura ::
Mantisa:
1,18125
1 * 1 + 0 * 0.5 + 0 * 0.25 + 1 * 0.125 + 0 * 0.0625 + 1 * 0.03125 + 1 * 0.015625 + 1 * 0,0078125 + 1 * 0,00390625 itd... in to imas 23 clenov in bos vidu da ne mores naredit tocno 1.18125. Od tod tvoja napaka.
1,18125
1 * 1 + 0 * 0.5 + 0 * 0.25 + 1 * 0.125 + 0 * 0.0625 + 1 * 0.03125 + 1 * 0.015625 + 1 * 0,0078125 + 1 * 0,00390625 itd... in to imas 23 clenov in bos vidu da ne mores naredit tocno 1.18125. Od tod tvoja napaka.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | float vs decimalOddelek: Programiranje | 6256 (4389) | Looooooka |
» | Spletne strani me postavljajo v SrbijoOddelek: Pomoč in nasveti | 3436 (2731) | Tarzan |
» | [C#] Domača naloga - osnoveOddelek: Programiranje | 2498 (1715) | 11tomi12 |
» | C (Izračun povprečja)Oddelek: Programiranje | 1618 (1252) | joze67 |
» | kaj je to plavajoča vejica??Oddelek: Loža | 10953 (7231) | Mavrik |