Now I forgot to attach the files :) On Sun, 6 Jan 2002, Boris Tschirschwitz wrote:
> Hi. > > I just implemented some opcodes for the 'GNU Scientific Library'. > The opcodes are in the file 'gsl.ops', and tests are in 'gsl.t' > These are very few and rather uninteresting ops, I was mostly checking if > I know how to do it. > I submit them already because: > > * I'd like to hear if you think that this is totally useless. > * I'd like to know if something should be done completely diffently > * I'll be away for a week, and I wanted to get something out, after > bugging you so often. > > There are perldoc instructions in gls.ops. > > Boris. > > >
/* ** GNU Scientific Library ops */ #include <gsl/gsl_math.h> VERSION = PARROT_VERSION; =head1 NAME gsl.ops =cut =head1 DESCRIPTION Parrot's library of GNU Scientific Library Opcodes The opcode explanations are taken (with minor changes) from 'GNU Scentific Library: Reference Mamual' To use these functions you'll have to configure parrot with the following two additional libraries, to be added before -lm: -lgsl -lgslcblas These Libraries are build with GSL GSL is availabe from the GSL homepage on www.gnu.org (it's a project on savannha.gnu.org) =cut ############################################################################### =head2 GSL Basic ops Reference: GSL Reference Manual =over 4 =cut ######################################## =item B<gsl_log1p>(n, n) This function computes the value of log(1 + x) in a way that is accurate for small x. It provides an alternative to the BSD math function log1p(x). =cut inline op gsl_log1p(n, n) { $1 = (FLOATVAL)gsl_log1p((double)$2); goto NEXT(); } # ######################################## =item B<gsl_expm1>(n, n) This function computes the value of exp(x)-1 in a way that is accurate for small x. It provides an alternative to the BSD math function expm1(x). =cut inline op gsl_expm1(n, n) { $1 = (FLOATVAL)gsl_expm1((double)$2); goto NEXT(); } # ######################################## =item B<gsl_hypot>(n, n, n) This function computes the value of sqrt(x^2 + y^2) in a way that avoids overflow. It provides an alternative to the BSD math function hypot(x,y). =cut inline op gsl_hypot(n, n, n) { $1 = (FLOATVAL)gsl_hypot((double)$2,(double)$3); goto NEXT(); } # ######################################## =item B<gsl_acosh>(n, n) This function computes the value of arccosh(x). It provides an alternative to the standard math function acosh(x). =cut inline op gsl_acosh(n, n) { $1 = (FLOATVAL)gsl_acosh((double)$2); goto NEXT(); } # ######################################## =item B<gsl_asinh>(n, n) This function computes the value of arcsinh(x). It provides an alternative to the standard math function acosh(x). =cut inline op gsl_asinh(n, n) { $1 = (FLOATVAL)gsl_asinh((double)$2); goto NEXT(); } # ######################################## =item B<gsl_atanh>(n, n) This function computes the value of arctanh(x). It provides an alternative to the standard math function acosh(x). =cut inline op gsl_atanh(n, n) { $1 = (FLOATVAL)gsl_atanh((double)$2); goto NEXT(); } =back ############################################################################### =head2 GSL Small Integer Powers ops Reference: GSL Reference Manual =over 4 =cut # ######################################## =item B<gsl_pow_int>(n, n, i) This routine computes the power x n for integer n. The power is computed using the minimum number of multiplications. For example, x 8 is computed as ((x 2 ) 2 ) 2 , requiring only 3 multiplications. A version of this function which also computes the numerical error in the result is available as gsl_sf_pow_int_e(Not implemented). =cut inline op gsl_pow_int(n, n, i) { $1 = (FLOATVAL)gsl_pow_int((double)$2,(int)$3); goto NEXT(); } # ######################################## =item B<gsl_pow_2>(n, n) gsl_pow_int(n, n, 2) =cut inline op gsl_pow_2(n, n) { $1 = (FLOATVAL)gsl_pow_2((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_3>(n, n) gsl_pow_int(n, n, 3) =cut inline op gsl_pow_3(n, n) { $1 = (FLOATVAL)gsl_pow_3((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_4>(n, n) gsl_pow_int(n, n, 4) =cut inline op gsl_pow_4(n, n) { $1 = (FLOATVAL)gsl_pow_4((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_5>(n, n) gsl_pow_int(n,n, 5) =cut inline op gsl_pow_5(n, n) { $1 = (FLOATVAL)gsl_pow_5((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_6>(n, n) gsl_pow_int(n, n, 6) =cut inline op gsl_pow_6(n, n) { $1 = (FLOATVAL)gsl_pow_6((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_7>(n, n) gsl_pow_int(n, n, 7) =cut inline op gsl_pow_7(n, n) { $1 = (FLOATVAL)gsl_pow_7((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_8>(n, n) gsl_pow_int(n, n, 8) =cut inline op gsl_pow_8(n, n) { $1 = (FLOATVAL)gsl_pow_8((double)$2); goto NEXT(); } # ######################################## =item B<gsl_pow_9>(n, n) gsl_pow_int(n, n, 9) =cut inline op gsl_pow_9(n, n) { $1 = (FLOATVAL)gsl_pow_9((double)$2); goto NEXT(); } # ######################################## =back =cut ############################################################################### =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
#! perl -w use Parrot::Test tests => 15; # GNU Scientific Library Opcodes # The opcode explanations are taken directly (with minor changes) from # "GNU Scentific Library: Reference Mamual" # To use these functions you'll have to configure parrot with the following two # additional libraries, to be added before -lm: # -lgsl -lgslcblas # # These Libraries are build with GSL # GSL is availabe from the GSL homepage on www.gnu.org (it's a project on savannha.gnu.org) # Elementary Functions output_is(<<'CODE', '0.000000', "log(1+0)"); set N1,0 gsl_log1p N2,N1 print N2 end CODE output_is(<<'CODE', '0.000000', "exp(0)-1"); set N1,0 gsl_expm1 N2,N1 print N2 end CODE output_is(<<'CODE', "5.000000" ,"sqrt(3^2+4^2)"); set N1,3 set N2,4 gsl_hypot N3,N1,N2 print N3 end CODE output_is(<<'CODE', "0.000000","arccosh(1)"); set N1,1 gsl_acosh N2,N1 print N2 end CODE output_is(<<'CODE', "0.000000","arcsinh(0)"); set N1,0 gsl_asinh N2,N1 print N2 end CODE output_is(<<'CODE', "0.000000","arctanh(0)"); set N1,0 gsl_atanh N2,N1 print N2 end CODE # Small Integer Powers output_is(<<'CODE', "1048576.000000","gsl_pow_int(2,20)"); set I1,20 set N1,2 gsl_pow_int N2,N1,I1 print N2 end CODE output_is(<<'CODE', "4.000000","gsl_pow_2(2)"); set N1,2 gsl_pow_2 N2,N1 print N2 end CODE output_is(<<'CODE', "8.000000","gsl_pow_3(2)"); set N1,2 gsl_pow_3 N2,N1 print N2 end CODE output_is(<<'CODE', "16.000000","gsl_pow_4(2)"); set N1,2 gsl_pow_4 N2,N1 print N2 end CODE output_is(<<'CODE', "32.000000","gsl_pow_5(2)"); set N1,2 gsl_pow_5 N2,N1 print N2 end CODE output_is(<<'CODE', "64.000000","gsl_pow_6(2)"); set N1,2 gsl_pow_6 N2,N1 print N2 end CODE output_is(<<'CODE', "128.000000","gsl_pow_7(2)"); set N1,2 gsl_pow_7 N2,N1 print N2 end CODE output_is(<<'CODE', "256.000000","gsl_pow_8(2)"); set N1,2 gsl_pow_8 N2,N1 print N2 end CODE output_is(<<'CODE', "512.000000","gsl_pow_9(2)"); set N1,2 gsl_pow_9 N2,N1 print N2 end CODE 1; # HONK