nasobeni realem v integerove aritmetice

Snail Instruments snail
Středa Březen 17 11:51:40 CET 2004


At 16:08 8.7.00 +0200, you wrote:
>Dobry den,
>neznate prosim nekdo algoritmus, kterym lze vyjadrit cislo real, jako zlomek
>s urcitou presnosti?

Ja pouzivam postup, naznaceny jiz ing. Pouchou.

Budto je Vasi snahou vyjadrit cislo co nejpresneji, aby pritom citatel ani
jmenovatel nepresahl urcitou hranici. To je nejlepsi resit pouzitim
'brutalni sily', cili nechat pocitac projit vsechny mozne jmenovatele, k
nim vypocitat citatele, zaokrouhlit na cele cislo, spocitat odchylku a
vybrat dvojici s nejmensi absolutni hodnotou odchylky. Pokud pouzivate
rutiny pro nasobeni a deleni, muzete takto dosahnout zrejme vyssi presnosti
pri pouziti mensich cisel.

Druhou moznosti je pouzivat pouze nasobeni a deleni nahradit instrukcemi
posunu (rotace), coz zase vede k rychlejsimu programovani i provadeni
programu. Nejsnadneji se rotuje po nasobcich 8 bitu, protoze staci zmenit
interpretaci vysledku - zanedbat nejnizsi byte ci dva a je to. Dalsi
moznosti je pouzit SWAP jako rotaci o 4 bity, ale to uz neni tak primocare.

V konkretnim pripade je 0.828 ~= 212/256 nebo  54264/65536. Zalezi, s jakou
presnosti je zmerena puvodni hodnota, mozna nema smysl pouzivat 16 bitovou
aritmetiku, mame-li na zacatku jenom 8 bitu rozliseni.

Ohledna algroritmu pro prevod desetinneho cisla na zlomek - asi plati
0.828=828/1000 a po zkraceni dostaneme 207/250. Ani Excel to zrejme
nevymysli lip.

J. Hanzal

>Potrebuji v integerove aritmetice (x51) vynasobit integer nejakou real
>konstantou. Rekneme 42865 x 0,828. Predstavuji si, ze to udelam jako 42865 x
>207 / 250 nebot 0,828 = 207 / 250. Zatim jde o pevne danou konstantu, tak to
>delam tak, ze si ji napisu do bunky Excela a nastavim tomu format "zlomky",
>ale chtel bych znat algoritmus, jak na to prijit s tuzkou a papirem. Je to
>nejaka banalni aritmeticka uloha ze zakladni skoly nebo je to neco
>slozitejsiho? Nakopnete prosim me mysleni spravnym smerem.







Další informace o konferenci Hw-list