Posted By: Rat (ctyri mozkove bunky) on 'CZprogram' Title: Re: Zaokrouhlovani cisla typu Extendedyy Date: Fri May 10 14:59: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. > Proc? Puvodni reseni (jestli mluvime o stejnem) bylo > if (abs(a-b) < konstanta) Nene, myslel jsem tohle reseni a tenhle pripad: if (abs(a * (1 + 1e-5) >= (abs(b))) and (abs(a * (1 - 1e-5)) < abs(b)) then rovna_se_to; Coz sice zafunguje dejme tomu pro stejne dobre porovnani cisel 1.000001e22 a 1.0e22 jako pro 1.0000001e-17 a 1.0 e-17, ale ma jako znacnou nevyhodu, ze to nefunguje pokud a=0.0 presne a b treba 1e-30, coz bychom radi Jednoduse, budes-li mit v b (zum Beispiel) 0, tak ti vyjde if (abs(a) < abs(a)/2e5) { ... } > > 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 :-) No, mozna jsem se trosku sek, ja jsem ty nuly nepocital ;) Mimochodem, ono je to stejne spatne v jedne dost podstatne veci, ale to uz je jedno... > Ne, pit jsem jeste nezacal, pouze nevyspani :-) a to stale pokracuje... :-( Nojo, nocni mury o racionalnich cislech jsou svinstvo ;) > 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/