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