Jak jednoduse spocitat rosny bod

Danhard danhard@volny.cz
Čtvrtek Prosinec 2 17:53:18 CET 2004


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