#!/usr/bin/perl $startangle = 45; $endangle = 135; $tablesize = 256; $amplitude = 127; $pi=atan2(1,1)*4; for ($index=0;$index < $tablesize; $index++) { $sinevalue=round_big_float($amplitude * sin(radians($startangle+($endangle-$startangle)*$index/($tablesize-1)))); $_=sprintf "%2x",$sinevalue; tr/a-z/A-Z/; s/FFFFFF//; s/ /0/; $sinearray[$index]="\tretlw\t0x".$_; } for ($index=0;$index < $tablesize; $index++) { $cosinevalue=round_big_float($amplitude * cos(radians($startangle+($endangle-$startangle)*$index/($tablesize-1)))); $_=sprintf "%2x",$cosinevalue; tr/a-z/A-Z/; s/FFFFFF//; s/ /0/; $cosinearray[$index]="\tretlw\t0x".$_; } print "\nsinetable\n"; for ($index=0;$index < $tablesize; $index++) { print "$sinearray[$index]\n"; } print "\ncosinetable\n"; for ($index=0;$index < $tablesize; $index++) { print "$cosinearray[$index]\n"; } sub radians {$_[0]*atan2(1,1)*4/180;} sub round_big_float { use Math::BigFloat; my $number = shift; my $digits = shift; unless (is_number($number)) { die "round_big_float: string $number is not a decimal number"; } if ($number lt "0") { $Math::BigFloat::rnd_mode = "-inf"; } else { $Math::BigFloat::rnd_mode = "+inf"; } my $result; { # Math::BigFloat is not -w clean local $^W = 0; $result = Math::BigFloat::ffround($number, -$digits); $result = Math::BigFloat->new($result); } return $result; } sub is_number { my $n = shift; # C float finding regexp from perlfaq4 return $n =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/; }