Posted By: Quasimodo (Quasimodo) on 'CZprogram'
Title:     Re: Zaokrouhlovani cisla typu Extendedy
Date:      Fri May 10 11:58:44 2002

> >  Dalsi, alternativni, jeste o malicko lepsi reseni, ktere si hlida rad 
> > promennych by bylo neco jako:
> >   epsilon:= (abs(a)+abs(b)) / 2e5;
> >   if abs(a-b) < epsilon then rovna_se_to;
> 
>  Tohle ti opet selze na stejnem pripadu jako ono prvni reseni.
Proc? Puvodni reseni (jestli mluvime o stejnem) bylo
if (abs(a-b) < konstanta)
a i b si dam v radu 10^30
konstanta byla navrhovana tusim 1e-6
rozdil a-b bude dejme tomu (nebudu pocitat binary) v radu 10^20, coz bych 
obvykle asi chtel prohlasit za shodu - 10 platnych decimalnich cislic byva 
dost. Ale tady mi to zfailuje.
Moje navrhovane reseni, ktre ma sice chyby, ale ty uz jsem naznacil, ma aspon 
tu vyhodu, ze epsilon ziskam priblizne v radu vstupnich operandu, to je cela 
vyhoda tohoto reseni. Selze na necem jinem :-)

> 
> > Ovsem protoze si svoji matikou nejsem nikdy moc jisty, tak bud rad 
> > vysledku odhadnu ze vstupnich parametru (programem) nebo pouzivam 
> > priblizne tohle:  
> > 
> > if ((abs(a + err) * (1 + 1e-5)) >= (abs(b + err) * (1 - 1e-5))) 
> >   and ((abs(a + err) * (1 - 1e-5)) <= (abs(b + err) * (1 + 1e-5))) 
> >   then rovna_se_to; 
> 
>  Tohle je lepsi, az na to, ze to +err by melo prijit mimo abs(), jinak 
> dopadnes stejne jako vyse.
> 
> > Ten finalni vyraz muze po mensim zjednoduseni nakonec vypadat asi takhle:
> > 
> > if (a = 0.00) then a:=err;
> > if (b = 0.00) then b:=err;
> > 
> > if ((a * (1+1e-5)) > b) = ((a * (1-1e-5) < b)  then rovna_se_to;
> 
>  if 
> ((abs(a)+err)*1.0000000000000000000000000000000000000000000000000000000000000
> 00
> 000000000000000000045 > (abs(b)+err) && 
> (abs(b)+err)*1.00000000000000000000000000000000000000000000000000000000000000
> 00
> 00000000000000000000000449 > (abs(a)+err)) { rovna_se_to(); }
> 
>  Ehe? 
> 
>  Problem je v tom, ze 0 a 1e-17 jsou porad hodne daleko, ale cisla na
> hranici 
> presnosti uz tim projdou. Ale to by clovek tak nejak cekal, ze? ;)
> 
A tohle bylo co? Tomu ze nejaky std "float" typ ma vic pouzitelnych 
dekadickych cifer nez cca 10-12 odmitam verit. Nicmene princim jsem snad 
pochopil :-) 

>  Ozraly programator napacha vic skody nez uzitku...
> 
Ne, pit jsem jeste nezacal, pouze nevyspani :-) a to stale pokracuje... :-(
-
Clovek je nejpomalejsi zname zarizeni typu I/O.
                                                                 Quasimodo

Search the boards