Jak jednoduse spocitat rosny bod

Danhard danhard@volny.cz
Pátek Prosinec 3 20:36:41 CET 2004


No on ten krok priblizovani  neni mensi, vzdyt rikam, ze je to nepresne
pocitani s nepresnymi cisly.
Spis se divim, ze to funguje tak dobre :o) Ja jsem to pouzil treba pro prevod
linearniho vykonu na stupnici v dB na 0,01dB.
Podle toho jakou potrebujete presnost, tak je zapotrebi zvolit pocet a
velikost tech priblizeni a taky delku operandu.
Co se tyce zaokrouhlovani, tady je zrejme ze bude jaksi "tahnout" na jednu
stranu, protoze vzdycky urezavame zbytek operace scitani.

Ja jsem mel konkretne ten algoritmis trochu slozitejsi, zavedl jsem si
kvalifikovany odhad a podle velikosti operandu (tj. podle pozice nasledujici
jednicky v operandu 10001.....) jsem urcil jakou konstanou to muzu jeste
znasobit abych nepretekl, a tu jsem pouzil, az jsem skoncil u te nejmensi, a
tou jsem nasobil az do preteceni. Konstant jsem tedy mel vic a cely vypocet se
skladal v podstate z  max.16 nasobeni prislusnou konstantou (tj. prictenim
prislusne posunuteho operandu a pricteni konstanty do akumulatoru vysledku).

TP po ruce bohuzel neni, ja to vyzdycky sjedu z pameti ve strojaku prislusneho
procesoru :o))

Danhard
-----------

Neviem ake kriterium mam zvolit, ale to primitivne "najvacsia chyba" sa
zhorsilo na 0.18%.
Inak som velkom tej logike "niekolkonasobnym zaokruhlenim sa to zlepsi"
neporozumel, podla mna sa to musi zhorsit.

wek

PS. Cela robota bola v prepisani 4 konstant, TP nebolo poruke?


Danhard wrote:
> No, tak nejak, byl to jen priklad nepresneho pocitani s nepresnymi cisly.
> Treba to priblizovani nasobenim 1.01hex budu delat v nejhorsim pripade 178x,
> takze to bude chtit aspon nejake zaokrouhleni, treba i nesymetricke, kdyz to
> snizi konecnou chybu. Lepsi zavest treba dalsi stupen priblizeni treba x
> 1.1hex (tj. pricist operand posunuty o 4 bity).
> Ta konstanta je priblizne 0.00169, presneji 0.001693158 (aspon tolik me
ukaze
> moje lacina kalkulacka), tak po binarni transformaci do 16 bit cisla
(x65536)
> bych byl rad aby to bylo 110,962804, na cele to bude 111, tj. 006F hex, a v
> prepoctu zpatky 0.001693725, takze ta celkova chyba bude hnedka o neco lepsi
> :o)
> VSECHNY ! vypocty s iracionalnimi cisly jsou vzdy kompromis mezi rychlosti,
> slozitosti a presnosti vypoctu.
>
> Kdyby jsi zkusil ty priblizovaci konstanty binarne, nebylo by to lepsi ?
> x2 = + 19728
> x1.01hex = -111
> vysledek /65536
>
> Danhard
> ----------------
>
> Takto?
> Najvacsia chyba medzi 2 a 65535 je okolo 0.14% ak to teda mam dobre.
>
> wek
>
> var
>      vstup,a,l:longint;
>      i:integer;
>      f:text;
> begin
>    assign(f,'');
>    rewrite(f);
>    for vstup:=2 to 65535 do begin
>      a:= vstup shl 16;
>      l:=0;
>      while (a>(1 shl 16)) or (a<0) do begin  {a<0 znamena vlastne a>=(1
> shl 31) v pascale nemame unsigned long}
>        a:=a shr 1;
>        l:=l+30103;
>      end;
>      while a<(1 shl 16) do begin
>        a:=a + (a shr 8);
>        l:=l-169;
>      end;
>      writeln(f,vstup,' ',
>              l/100000:10:7,' ',
>              ln(vstup)/ln(10):10:7,' ',
>              (l/100000-ln(vstup)/ln(10))/(ln(vstup)/ln(10))*100:5:2,'%');
>    end;
>    close(f);
> end.





Další informace o konferenci Hw-list