Portál AbcLinuxu, 14. května 2025 00:06

Dotaz: Porovnanie desatinnych cisel

25.5.2006 14:54 robob | skóre: 12 | blog: robob
Porovnanie desatinnych cisel
Přečteno: 183×
Odpovědět | Admin
Zdravim. Potreboval by som numericky korektne porovnanie desatinnych cisel v programe. Desatinne cisla sa do binarnej formy prevedu s urcitou chybou. To je znamy fakt. Ako teda porovnat ci sa dve cisla "zhruba" rovnaju?

Uvediem priklad a moje riesenie, kde mam porovnat if (t == det):
#define EPS 1e-08
double dxa, dya, dxb, dyb, dx1, dy1, det, t, det_eps, t_eps;

det = dxa * dyb - dya * dxb;
det_eps = EPS * (abs(dxa) + abs(dyb) + abs(dya) + abs(dxb));

t = dx1 * dyb - dy1 * dxb;
t_eps = EPS * (abs(dx1) + abs(dyb) + abs(dy1) + abs(dxb));

if (abs(t-det) < abs(t_eps) + abs(det_eps))
Matematicke oddovodnenie tu radsej neuvadzam.

Budem vdacny za kazdy odkaz na nejaku literaturu na webe, rsp. za Vase riesenie.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.5.2006 15:10 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechápem prečo tam čaruješ. Akú má chybu toto?
#define EPS 1e-8
#define FLOAT_EQUAL(x,y) (abs((x)-(y))<EPS)

if (FLOAT_EQUAL(t,det)) ...
25.5.2006 15:24 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
miesto EPS treba pouzivat "strojove epsilon"
v gcc je to tusim float.h, konstanty FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
25.5.2006 15:30 robob | skóre: 12 | blog: robob
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
Takze konkretny priklad:

x = 1000000000.1 a y = 4.5

det = x * y

Tu zrejme asi nebude korektne eps = 1e-8 pre det, ci ano ? Chyba pri cisle y sa totiz zmnohonasobi a uz to nebude stare dobre cislo 1e-8.
vdusek avatar 25.5.2006 15:21 vdusek | skóre: 27
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud to je reálné (vzhledem k počtu desetinných míst a délce čísla) tak bych desetinná čísla převedl na vynásobením na integer a pak porovnával. Záleží, jaké je původní zadání, resp. jak ta desetinná čísla vznikají. Třeba by bylo zajímavé počítat od začátku v integer s tím, že výsledek na konci podělím....
25.5.2006 15:36 robob | skóre: 12 | blog: robob
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
V skutocnosti to naozaj mozem obist a robit v celych cislach (prenasobenim). Chcel som poznat nazor niekoho, kto trochu numericky premysla.
25.5.2006 15:39 robob | skóre: 12 | blog: robob
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak by niekoho zaujimalo, tak som nasiel na webe toto: Why doesn't my floating-point comparison work?
25.5.2006 16:03 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Porovnanie desatinnych cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ty zdrojáky jsou do soutěže o co nejméně efektivní porovnání dvou floatů? :-D

Jinak doporučuji k pozornosti nový seriál Pavla Tišnovského Fixed point arithmetic.
When your hammer is C++, everything begins to look like a thumb.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.