diff options
Diffstat (limited to 'mdk-stage1/slang/slmath.c')
-rw-r--r-- | mdk-stage1/slang/slmath.c | 565 |
1 files changed, 0 insertions, 565 deletions
diff --git a/mdk-stage1/slang/slmath.c b/mdk-stage1/slang/slmath.c deleted file mode 100644 index 1d61e14d3..000000000 --- a/mdk-stage1/slang/slmath.c +++ /dev/null @@ -1,565 +0,0 @@ -/* sin, cos, etc, for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include <math.h> - -#include "slang.h" -#include "_slang.h" - -#ifdef PI -# undef PI -#endif -#define PI 3.14159265358979323846264338327950288 - -#if defined(__unix__) -#include <signal.h> -#include <errno.h> - -#define SIGNAL SLsignal - -static void math_floating_point_exception (int sig) -{ - sig = errno; - if (SLang_Error == 0) SLang_Error = SL_FLOATING_EXCEPTION; - (void) SIGNAL (SIGFPE, math_floating_point_exception); - errno = sig; -} -#endif - -double SLmath_hypot (double x, double y) -{ - double fr, fi, ratio; - - fr = fabs(x); - fi = fabs(y); - - if (fr > fi) - { - ratio = y / x; - x = fr * sqrt (1.0 + ratio * ratio); - } - else if (fi == 0.0) x = 0.0; - else - { - ratio = x / y; - x = fi * sqrt (1.0 + ratio * ratio); - } - - return x; -} - -/* usage here is a1 a2 ... an n x ==> a1x^n + a2 x ^(n - 1) + ... + an */ -static double math_poly (void) -{ - int n; - double xn = 1.0, sum = 0.0; - double an, x; - - if ((SLang_pop_double(&x, NULL, NULL)) - || (SLang_pop_integer(&n))) return(0.0); - - while (n-- > 0) - { - if (SLang_pop_double(&an, NULL, NULL)) break; - sum += an * xn; - xn = xn * x; - } - return (double) sum; -} - -static int double_math_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) op; - - if (a != SLANG_FLOAT_TYPE) - *b = SLANG_DOUBLE_TYPE; - else - *b = a; - - return 1; -} - -#ifdef HAVE_ASINH -# define ASINH_FUN asinh -#else -# define ASINH_FUN my_asinh -static double my_asinh (double x) -{ - return log (x + sqrt (x*x + 1)); -} -#endif -#ifdef HAVE_ACOSH -# define ACOSH_FUN acosh -#else -# define ACOSH_FUN my_acosh -static double my_acosh (double x) -{ - return log (x + sqrt(x*x - 1)); /* x >= 1 */ -} -#endif -#ifdef HAVE_ATANH -# define ATANH_FUN atanh -#else -# define ATANH_FUN my_atanh -static double my_atanh (double x) -{ - return 0.5 * log ((1.0 + x)/(1.0 - x)); /* 0 <= x^2 < 1 */ -} -#endif - -static int double_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *a, *b; - unsigned int i; - double (*fun) (double); - - (void) type; - a = (double *) ap; - b = (double *) bp; - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[i]; - return 1; - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - b[i] = (*fun) (a[i]); - - return 1; -} - -static int float_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - float *a, *b; - unsigned int i; - double (*fun) (double); - - (void) type; - a = (float *) ap; - b = (float *) bp; - - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[i]; - return 1; - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - b[i] = (float) (*fun) ((double) a[i]); - - return 1; -} - -static int generic_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *b; - unsigned int i; - SLang_To_Double_Fun_Type to_double; - double (*fun) (double); - unsigned int da; - char *a; - - if (NULL == (to_double = SLarith_get_to_double_fun (type, &da))) - return 0; - - b = (double *) bp; - a = (char *) ap; - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - { - b[i] = to_double((VOID_STAR) a); - a += da; - } - return 1; - - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - { - b[i] = (*fun) (to_double ((VOID_STAR) a)); - a += da; - } - - return 1; -} - -#if SLANG_HAS_COMPLEX -static int complex_math_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) a; - switch (op) - { - default: - *b = SLANG_COMPLEX_TYPE; - break; - - case SLMATH_REAL: - case SLMATH_IMAG: - *b = SLANG_DOUBLE_TYPE; - break; - } - return 1; -} - -static int complex_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *a, *b; - unsigned int i; - unsigned int na2 = na * 2; - double *(*fun) (double *, double *); - - (void) type; - a = (double *) ap; - b = (double *) bp; - - switch (op) - { - default: - return 0; - - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[2 * i]; - return 1; - - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = a[2 * i + 1]; - return 1; - - case SLMATH_CONJ: - for (i = 0; i < na2; i += 2) - { - b[i] = a[i]; - b[i+1] = -a[i+1]; - } - return 1; - - case SLMATH_ATANH: - fun = SLcomplex_atanh; - break; - case SLMATH_ACOSH: - fun = SLcomplex_acosh; - break; - case SLMATH_ASINH: - fun = SLcomplex_asinh; - break; - case SLMATH_EXP: - fun = SLcomplex_exp; - break; - case SLMATH_LOG: - fun = SLcomplex_log; - break; - case SLMATH_LOG10: - fun = SLcomplex_log10; - break; - case SLMATH_SQRT: - fun = SLcomplex_sqrt; - break; - case SLMATH_SIN: - fun = SLcomplex_sin; - break; - case SLMATH_COS: - fun = SLcomplex_cos; - break; - case SLMATH_SINH: - fun = SLcomplex_sinh; - break; - case SLMATH_COSH: - fun = SLcomplex_cosh; - break; - case SLMATH_TANH: - fun = SLcomplex_tanh; - break; - case SLMATH_TAN: - fun = SLcomplex_tan; - break; - case SLMATH_ASIN: - fun = SLcomplex_asin; - break; - case SLMATH_ACOS: - fun = SLcomplex_acos; - break; - case SLMATH_ATAN: - fun = SLcomplex_atan; - break; - } - - for (i = 0; i < na2; i += 2) - (void) (*fun) (b + i, a + i); - - return 1; -} -#endif - -static SLang_DConstant_Type DConst_Table [] = -{ - MAKE_DCONSTANT("E", 2.718281828459045), - MAKE_DCONSTANT("PI", 3.14159265358979323846264338327950288), - SLANG_END_DCONST_TABLE -}; - -static SLang_Math_Unary_Type SLmath_Table [] = -{ - MAKE_MATH_UNARY("sinh", SLMATH_SINH), - MAKE_MATH_UNARY("asinh", SLMATH_ASINH), - MAKE_MATH_UNARY("cosh", SLMATH_COSH), - MAKE_MATH_UNARY("acosh", SLMATH_ACOSH), - MAKE_MATH_UNARY("tanh", SLMATH_TANH), - MAKE_MATH_UNARY("atanh", SLMATH_ATANH), - MAKE_MATH_UNARY("sin", SLMATH_SIN), - MAKE_MATH_UNARY("cos", SLMATH_COS), - MAKE_MATH_UNARY("tan", SLMATH_TAN), - MAKE_MATH_UNARY("atan", SLMATH_ATAN), - MAKE_MATH_UNARY("acos", SLMATH_ACOS), - MAKE_MATH_UNARY("asin", SLMATH_ASIN), - MAKE_MATH_UNARY("exp", SLMATH_EXP), - MAKE_MATH_UNARY("log", SLMATH_LOG), - MAKE_MATH_UNARY("sqrt", SLMATH_SQRT), - MAKE_MATH_UNARY("log10", SLMATH_LOG10), -#if SLANG_HAS_COMPLEX - MAKE_MATH_UNARY("Real", SLMATH_REAL), - MAKE_MATH_UNARY("Imag", SLMATH_IMAG), - MAKE_MATH_UNARY("Conj", SLMATH_CONJ), -#endif - SLANG_END_MATH_UNARY_TABLE -}; - -static SLang_Intrin_Fun_Type SLang_Math_Table [] = -{ - MAKE_INTRINSIC_0("polynom", math_poly, SLANG_DOUBLE_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -int SLang_init_slmath (void) -{ - unsigned char *int_types; - -#if defined(__unix__) - (void) SIGNAL (SIGFPE, math_floating_point_exception); -#endif - - int_types = _SLarith_Arith_Types; - - while (*int_types != SLANG_FLOAT_TYPE) - { - if (-1 == SLclass_add_math_op (*int_types, generic_math_op, double_math_op_result)) - return -1; - int_types++; - } - - if ((-1 == SLclass_add_math_op (SLANG_FLOAT_TYPE, float_math_op, double_math_op_result)) - || (-1 == SLclass_add_math_op (SLANG_DOUBLE_TYPE, double_math_op, double_math_op_result)) -#if SLANG_HAS_COMPLEX - || (-1 == SLclass_add_math_op (SLANG_COMPLEX_TYPE, complex_math_op, complex_math_op_result)) -#endif - ) - return -1; - - if ((-1 == SLadd_math_unary_table (SLmath_Table, "__SLMATH__")) - || (-1 == SLadd_intrin_fun_table (SLang_Math_Table, NULL)) - || (-1 == SLadd_dconstant_table (DConst_Table, NULL))) - return -1; - - return 0; -} - |