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/