Posted By: pivson (Pijte pivo, je zdrave !!!) on 'CZprogram' Title: Re: Zaokrouhlovani cisla typu Extendedy Date: Fri May 10 20:05:22 2002 > Tohle se tu resilo cca pred nejakou relativne nedavnou dobou, a ... FPU > dokaze naprosto presne vyjadrit jakekoli cele cislo (rozumne velke - tzn. do > velikosti mantisy). Jasne, ja to bral jen jako priklad (ilustraci). Obecne cely cisla vyjadris presne, to se shodnem. Ono taky pokud se budes pohybovat v N/Z cislech, tak ve vetsine pripadu ani nepotrebujes epsilon (viz niz). > Jestli vyse uvedene spravne chapu, tak tvrdis, ze if (abs(a-b) < KONST_EPS) > je spravny zpusob porovnani pro jakkoli velke/male a, b ? Presnost se ti > prave > ztraci v prvnim bitu za mantisou, ktera na exponentu zavisla je. Zkus > loadnout > double, ulozit ho dvakrat jako float, jednou pri nastavenem zaokrouhlovani > dolu, podruhe nahoru, loadni znovu a spocitej rozdil. Pokud jsou a,b 'ruzna' hodne od sebe, pak je jejich rozdil sam o sobe velkej, tutiz porovnani s E vyjde 'tak jak ma' (tedy to abs bude vetsi). Ztraci se vic nez jeden bit, neb interne je presnost 80 (intelovsky FPU). Co se tyce tohodle bitu, tak pri dodrzeni podminky ze M je <0.5-1) bude vzdy nejvissy bit mantisi 1ka a toho je v IEEE754 zneuzito k tomu (neni pouzivanej a pri vypoctech je doplnovanej automaticky) se zvojnasuboje presnost. Pokud se dostavas do oblasti nizkych exponentu (hodne malych cisel) tak prestava mit smysl neco porovnavat na presnost (ted sa bavime o cislech blizkych nejnizsimu vyjadritelnymu cislu). A samozrejmne ze to zavisi na zaokrouhlovani (a je jedno jesli je dvojita nebo normlani presnot, vzdy se bude zaokrouhlovat). Tedy ano, dovolim si trvdit ze je to spravne (minimalne podle IEEE normy kdyz ne podle mne :) Podle mne, pokud cisla na vstupu mas presne vyjadritelna v soustave co FPU pouziva a vysledek vypoctu je opetovne vyjadritelnej (bez chyb) v soustave cisel na vstupu/vustupu (tedy m*10^e), potom ti test bude sedet primo. To jsem tim chtel rict. Nic vic nic min. Nechci se prit o zaokrouhlovani a pod. To je JINA story. Neboli: a=1.345; b=1.123; c=a+b; if (c==2.468) NEBUDE fungovat, protoze 1.123 nevyjadris presne. Bude to 0.5615*2^1 coz je 1.12299999999999999999999999999 [ted uz mne doufam nebudes chytat za slovo - mas tu exaktni priklad] coz je sice moooc mala chyba (prakticky nevyjadritelna - nekonecne mala - asi jako u tech zlomku jak jsem postoval vise), nicmene, zapricini onu 'nepresnost' (kde se porovnava absolutni binarni hodnota). Nic vic netvrdim. A proto je epsilon tak maly aby pokrylo JEN tento rozdil, NIC vic. Abych to dokoncil, test neprojde. Pokud a/b zmenis na a=1.345 b=1.2228 Tak uz to projde, protoze obe cisla vyjadris presne v notaci FPU a=0.6725*2^1 b=0.5614*2^1 [oboje jsem pro jistotu odzkousel a fungujou - jak slackware tak windoze] Zkus si to, pripadne sem muzu nakopirovat binarni podobu techto cisel. Pokud bude existovat presna reprezentace mezi soustavama, pak bude i presne sedet vysledek. Chyba pri vypoctu, vznikla zaokrouhlovanim je 'jina'. Ta se tady neimplikuje (kde ce treba ve vyse uvedem projevi ?) Neboli, tuhle chybu ja neberu v potaz, protoze uz jen ta "nepresnost" staci k tomu abys potreboval epsilon. A chybu v zaokrouhlovani nemuzes posuzovat obecne, ta zalezi uz na konkretni veci (co se pocita, jak, v jakym poradi, ....) Ad zaokrouhlovani - tak je to zavisli na VYSI cisla, to se shodneme. Ale nepresnot o ktery tu mluvime prameni nekde jinde (viz puvodni post kde bylo klasicky a,b,c=a+b a test na c). Nekde muze byt chyba (absolutne) 0.0000000000001% 'adekvatni' (a akceptovatelna), jinde to mzue byt uplne jinak. Nechapu proc sem pletes double a floaty (predpokladam ze mas na mysli 32/64). Napis vis co si tim myslel. Ja celou dobu mluvim o nepresnoti jako TAKOVY, ne nepresnosti vzikajici PRI vypoctu (opet odkazuji na puvodni post, presne na toto narazel). > Tohle podle me nezalezi ani tak na soustave, jako spis na lidske definici > ;) Zalezi to na soustave v jaky visla vyjadrujes. Ted nemam na mysli obor (N,Z,R,Q...). Pokud jedno cislo vyjadrujes ve tvaru x=m*10^e a druhy y=m*2^e Tak z toho plyne, ze ne vsechna X bydou mit adekvatni (naprosto __presne__) vyjadreni v Y a opacne. Uplne stejne jako barevny soustavy. RGB - HSL - CMYK.... Ne vsechny barvy vyjadris presne napric soustavama. Proto ma Photoshop a podobny editaci primo (napr.) v CMYK, nebo existujou zobrazovaci zarizeni CMYK. Uplne stejne je to s floatama. Pro grafika ta ztrata nekdy muze bejt az moc velka. Stejne tak pro matematika. Proto existujou kniohny, ktery pocitaj n 'nasi' soustave, tedy nenabalujou se na sebe '2' nepresnoti. Nepresnost vypoctu (ta existuje) a neprenost (rekneme) prevodu mezi soustavama. Nicmene, nejsem matematik tak asi nepouzivam spavne nazvoslovi pro soustavu/mnozinu a ja nevim co. Soustava = tak jak cislo vyjadruju (treba 2 versis 10 v exponentu). Pokud je to jinak, sem s tim. Pivson I a posledni, z bozi vule pivar A co budou delat cesi ??? Deme na pivo !