Posted By: Rat (ctyri mozkove bunky) on 'CZprogram'
Title:     Re: Zaokrouhlovani cisla typu Extendedy
Date:      Thu May  9 21:14:53 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.

> 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.000000000000000000000000000000000000000000000000000000000000000
000000000000000000045 > (abs(b)+err) && 
(abs(b)+err)*1.0000000000000000000000000000000000000000000000000000000000000000
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? ;)

> Tak a ted doufam, ze jsem toho moc nezvoral, jsem silene ospalej a boli me 
> hlava... 

 Ozraly programator napacha vic skody nez uzitku...

> -
> Clovek je nejpomalejsi zname zarizeni typu I/O.
>                                                                  Quasimodo

        Krysa
                rat@atrey.karlin.mff.cuni.cz              Jsem Krysa
                http://atrey.karlin.mff.cuni.cz/~rat/

Search the boards