#!/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)