Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sin, cos, tan ?

0 views
Skip to first unread message

Kai Birger Nielsen

unread,
May 2, 2000, 3:00:00 AM5/2/00
to
For nogen tid siden var der en, der spurgte hvordan
lommeregnere regner sin, cos, tan ud. Jeg har kigget
lidt i en bog, der hedder decimal computation af Hermann
Schmid og der var en sød metode ved navn Cordic beskrevet
i passende detalje. Her kommer et lille program, der
leger lommeregner:

#!/usr/local/bin/perl -w
@a = ( 45.000000000000, 26.565051177078, 14.036243467926, 7.125016348902,
3.576334374997, 1.789910608246, 0.895173710211, 0.447614170861,
0.223810500369, 0.111905677066, 0.055952891894, 0.027976452617,
0.013988227142, 0.006994113675, 0.003497056851, 0.001748528427,
0.000874264214, 0.000437132107, 0.000218566053, 0.000109283027,
0.000054641513, 0.000027320757, 0.000013660378, 0.000006830189,
0.000003415095, 0.000001707547, 0.000000853774, 0.000000426887,
0.000000213443, 0.000000106722, 0.000000053361, 0.000000026680,
0.000000013340, 0.000000006670, 0.000000003335, 0.000000001668,
0.000000000834, 0.000000000417, 0.000000000208, 0.000000000104,
0.000000000052, 0.000000000026, 0.000000000013, 0.000000000007,
0.000000000003, 0.000000000002, 0.000000000001, 0.000000000000,
0.000000000000, 0.000000000000,);

$k = 0.607252935008882;

sub sine {
my($v) = $_[0];
my($x,$y,$t) = ($k,0,1);
for $i (0..$#a) {
if ($v > 0) {
($x,$y,$t,$v) = ($x-$t*$y,$y+$t*$x,$t/2,$v-$a[$i]);
} else {
($x,$y,$t,$v) = ($x+$t*$y,$y-$t*$x,$t/2,$v+$a[$i]);
}
}
return sprintf("%8.12f",$y);
}

for $v (@ARGV) {
print "$v"." ".&sine($v)."\n";
}

En stak tabelværdier som skabt til at blive støbt ned i en ROM kreds
og en meget simpel algoritme, der nok også kan loddes ind i en
minimal mængde maskinkode til fx en HP lommeregner.

Jeg tror lige jeg lader den stå uden kommentarer for en tid, og ser
om der er nogen, der kan gennemskue hvad der foregår. :-)

mvh Birger Nielsen (bnie...@daimi.au.dk)


0 new messages