I've added a couple of functions to math.ops now. What do you think about adding complex functions? ( complex.h )
/josef
diff -urN parrot.orig/MANIFEST parrot/MANIFEST --- parrot.orig/MANIFEST Thu Jun 13 00:12:15 2002 +++ parrot/MANIFEST Thu Jun 13 09:31:56 2002 @@ -354,6 +354,7 @@ lib/Test/Simple.pm lib/Text/Balanced.pm make.pl +math.ops memory.c misc.c obscure.ops diff -urN parrot.orig/math.ops parrot/math.ops --- parrot.orig/math.ops Thu Jan 1 01:00:00 1970 +++ parrot/math.ops Thu Jun 13 09:31:10 2002 @@ -0,0 +1,161 @@ +/* +** math.ops +*/ + +VERSION = PARROT_VERSION; + +=head1 NAME + +math.ops + +=cut + +=head1 DESCRIPTION + +Parrot's library of math ops. + +=cut + + +######################################## + +=head2 Other mathematical operations + +Implementations of various mathematical operations + +=over 4 + +=cut + + +######################################## + +=item B<gcd>(out INT, in INT, in INT) + +=item B<gcd>(out INT, in NUM, in NUM) + +Greatest Common divisor of $2 and $3. + +=cut + +inline op gcd(out INT, in INT, in INT) { + +UINTVAL q = 0; +UINTVAL c = 0; + while ($3 != 0) { + q = floor( (FLOATVAL)$2/$3 ); + c = $2 - $3*q; + $2 = $3; + $3 = c; + } + $1 = $2; + goto NEXT(); +} + +inline op gcd(out INT, in NUM, in NUM){ + +UINTVAL q = 0; +UINTVAL c = 0; + while ($3 != 0) { + q = floor( (FLOATVAL)$2/$3 ); + c = $2 - $3*q; + $2 = $3; + $3 = c; + } + $1 = $2; + goto NEXT(); +} + +######################################## + +=item B<lcm>(out INT, in INT, in INT) + +=item B<lcm>(out NUM, in INT, in INT) + +Least Common Multiple + +=cut + +inline op lcm(out INT, in INT, in INT) { + +UINTVAL q = 0; +UINTVAL c = 0; +INTVAL saved_var2 = $2; +INTVAL saved_var3 = $3; + while ($3 != 0) { + q = floor( (FLOATVAL)$2/$3 ); + c = $2 - $3*q; + $2 = $3; + $3 = c; + } + saved_var2 = saved_var2/$2; + $1 = saved_var2*saved_var3; + goto NEXT(); +} + +inline op lcm(out NUM, in INT, in INT) { + +UINTVAL q = 0; +UINTVAL c = 0; +INTVAL saved_var2 = $2; +INTVAL saved_var3 = $3; + while ($3 != 0) { + q = floor( (FLOATVAL)$2/$3 ); + c = $2 - $3*q; + $2 = $3; + $3 = c; + } + saved_var2 = saved_var2/$2; + $1 = (FLOATVAL)saved_var2*saved_var3; + goto NEXT(); +} + + +######################################## + +=item B<fact>(out INT, in INT) + +=item B<fact>(out NUM, in INT) + +Factorial, n!. Calculates the product of 1 to N. + +=cut + +inline op fact(out INT, in INT) { + +UINTVAL i = $2; +UINTVAL q = 1; + while(i>0) { + q = q*i; + i--; + } + $1 = q; + goto NEXT(); +} + +inline op fact(out NUM, in INT) { + +UINTVAL i = $2; +UINTVAL q = 1; + while(i>0) { + q = q*i; + i--; + } + $1 = q; + goto NEXT(); +} + + +######################################## + + +=head1 COPYRIGHT + +Copyright (C) 2001-2002 Yet Another Society. All rights reserved. + +=head1 LICENSE + +This program is free software. It is subject to the same license +as the Parrot interpreter itself. + +=cut