» »

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

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.

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

overlord_tm ::

noraguta ::

Pust' ot pobyedy k pobyedye vyedyot!

twom ::

Še vseeno mi ni jasno zakaj števila 18.9 ne zapiše kot
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.

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 ::

Mavrik je izjavil:

peter_nn: Ker zapisuje v binarnem formatu ne desetiškem. Probaj tisto tvoje zapisat v IEEE754 :)


Ok,
se predam!

Bom iskal, če se lahko izognem floatingu...

Lp

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).
"Bit je kot določna popolnoma nedoločna." (M. Heidegger)

MrBrdo ::

Za zapis pa se pogosto uporablja BCD format pri bančništvu.
MrBrdo

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.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

float vs decimal

Oddelek: Programiranje
366259 (4392) Looooooka
»

Spletne strani me postavljajo v Srbijo

Oddelek: Pomoč in nasveti
143462 (2757) Tarzan
»

[C#] Domača naloga - osnove

Oddelek: Programiranje
372498 (1715) 11tomi12
»

C (Izračun povprečja)

Oddelek: Programiranje
141620 (1254) joze67
»

kaj je to plavajoča vejica??

Oddelek: Loža
4010961 (7239) Mavrik

Več podobnih tem