/* math.c: this file contains the math efunctions called from inside eval_instruction() in interpret.c. -- coded by Truilkan 93/02/21 */ #include <math.h> #include "efuns.h" #include "simulate.h" #define pI 3.1415926535896932384626433832795080 #ifdef MATH void f_cos(int num_arg,struct svalue *argp) { argp[0].u.fnum= cos(argp[0].u.fnum); } void f_sin(int num_arg,struct svalue *argp) { argp[0].u.fnum=sin(argp[0].u.fnum); } void f_tan(int num_arg,struct svalue *argp) { float f; f=(argp->u.fnum-pI/2) / pI; if(f==floor(f+0.5)) { error("Impossible tangent.\n"); return; } argp[0].u.fnum= tan(argp[0].u.fnum); } void f_asin(int num_arg, struct svalue *argp) { argp[0].u.fnum= asin(argp[0].u.fnum); } void f_acos(int num_arg, struct svalue *argp) { argp[0].u.fnum= acos(argp[0].u.fnum); } void f_atan(int num_arg, struct svalue *argp) { float f; f=(argp->u.fnum-pI/2) / pI; if(f==floor(f+0.5)) { error("Impossible tangent.\n"); return; } argp[0].u.fnum = atan(argp[0].u.fnum); } void f_sqrt(int num_arg, struct svalue *argp) { if(argp[0].type==T_NUMBER) { int a,b,c,q; q=sp->u.number; for(a=0,b=0x10000;a+1<b;) { c=(a+b)/2; if(c*c>q) b=c; else a=c; } sp->u.number=a; }else{ if (argp[0].u.fnum< 0.0) { error("math: sqrt(x) with (x < 0.0)\n"); return; } argp[0].u.fnum = sqrt(argp[0].u.fnum); } } void f_log(int num_arg,struct svalue *argp) { if (argp[0].u.fnum <= 0.0) { error("math: log(x) with (x <= 0.0)\n"); return; } argp[0].u.fnum = log(argp[0].u.fnum); } void f_pow(int num_arg,struct svalue *argp) { argp[0].u.fnum = pow(argp[0].u.fnum,argp[1].u.fnum); pop_stack(); } void f_exp(int num_arg,struct svalue *argp) { argp[0].u.fnum = exp(argp[0].u.fnum); } void f_floor(int num_arg,struct svalue *argp) { argp[0].u.fnum = floor(argp[0].u.fnum); } void f_ceil(int num_arg,struct svalue *argp) { argp[0].u.fnum = ceil(argp[0].u.fnum); } #endif