Document: FIE Purpose: Describes the routines FIEINI (parses an input string which contains mathematical expression), FIEDO (which does the actual calculations) and FIEDUMP (which dumps the code generated by FIEINI). Category: MATH File: fie.c Author: K.G. Begeman Description: FIEINI parses an input string which contains a mathematical formula. The input string may contain: 1) functions; syntax ff(..); where ff is one of the following available functions: abs(x) absolute value of x sqrt(x) square root of x sin(x) sine of x asin(x) inverse sine of x cos(x) cosine of x acos(x) inverse cosine of x tan(x) tangent of x sec(x) secans of x csc(x) cosecans of x cot(x) cotangent of x atan(x) inverse tan of x atan2(x,y) inverse tan (mod 2pi) x = sin, y = cos exp(x) exponential of x ln(x) natural log of x log(x) log (base 10) of x sinh(x) hyperbolic sine of x asinh(x) inverse hyperbolic sine of x cosh(x) hyperbolic cosine of x acosh(x) inverse hyperbolic cosine of x tanh(x) hyperbolic tangent of x sech(x) hyperbolic secans of x csch(x) hyperbolic cosecans of x coth(x) hyperbolic cotangent of x bj(n,x) Bessel function of 1st kind, integer order by(n,x) Bessel function of 2nd kind, integer order bi(n,x) modified Bessel fn. of 1st kind, integer order bk(n,x) modified Bessel fn. of 2nd kind, integer order rad(x) convert x to radians deg(x) convert x to degrees erf(x) error function of x erfc(x) 1-error function sinc(x) sin(x)/x (sinc function) sign(x) sign of x (-1,0,1) step(x) returns 1 if x > 0, else 0 rect(x) returns 1 if |x| < 0.5, else 0 mod(x,y) gives remainder of x/y int(x) truncates to integer nint(x) nearest integer ranu(x,y) generates uniform noise between x and y rang(x,y) generates gaussian noise with mean x and dispersion y ranp(x) generates poisson noise with mean x ifeq(x,y,a,b) returns a if x == y, else b ifne(x,y,a,b) returns a if x != y, else b ifgt(x,y,a,b) returns a if x > y, else b ifge(x,y,a,b) returns a if x >= y, else b iflt(x,y,a,b) returns a if x < y, else b ifle(x,y,a,b) returns a if x <= y, else b ifblank(x,a,b) returns a if x == BLANK, else b Some (statistical) functions have a variable number of arguments: sum(x1,..,xn) sum of elements x1 .. xn mean(x1,..,xn) mean var(x1,..,xn) variance sdev(x1,..,xn) standard deviation adev(x1,..,xn) absolute deviation skew(x1,..,xn) skewness kurt(x1,..,xn) kurtosis median(x1,..,xn) median nblanks(x1,..,xn) number of blanks max(x1,..,xn) maximum of elements x1 .. xn min(x1,..,xn) minimum Note that n <= 128 2) constants; syntax cc; where cc is one of the following available constants: PI 3.14159.... C speed of light (SI) H Planck (SI) K Boltzmann (SI) G gravitation (SI) S Stefan-Boltzman (SI) M mass of sun (SI) P parsec (SI) BLANK Universal undefined value Note: the Hubble constant is not included. 3) operators; syntax op; where op is one of the following available operators: + addition - subtraction * multiplication / division ** power 4) parameters; syntax $n; where 1 <= n <= 128. A parameter is a value taken from a real array inserted at the position of $n in the expression. FIEDO inserts the parameters in the expression. Note: With the subroutine fiepar the programmer can define parameter names. The working of FIEINI is best explained by an example; the expression '1.0+exp($1)*sinc($3)' is decoded into the following commands: LDC 1.0 ! load constant LDP 1 ! load parameter 1 FIE EXP ! exp() LDP 3 ! load parameter 3 FIE SINC ! sinc() MUL ! * ADD ! + HLT ! end of code This code is stored internally for later processing by FIEDO. The procedure FIEDUMP displays the internally stored instructions as shown above on stdin. There are at the moment 16 different buffers for storage of instructions. Notes: 1) The calculations are all done in double precision. 2) FIEDO recognizes BLANK values. Any operation on a BLANK causes the result to be set to BLANK (except the function IFBLANK). Also all illegal operations, like dividing by zero or the logarithm of a negative value, will cause the result to be set to BLANK. 3) If you cannot find your favorite constant or function in the list, please contact the author. He might be persuaded to put it in. Updates: Mar 11, 1987: RPK original code Mar 12, 1987: KGB document created May 28, 1987: KGB RPK bug removed Oct 27, 1987: RPK KGB bug removed Aug 15, 1988: KGB RPK bug in decoding reals fixed Aug 1, 1989: KGB converted to GPS Mar 28, 1991: KGB parameter names allowed Feb 21, 1995: KGB/VOG multi-parameter functions added Feb 7, 1997: JPT named parameters supersede built-in constants. Jun 30, 1998: JPT implemented Bessel functions. Aug 11, 1998: JPT fixed bug in nint; added sec, csc, cot, sech, csch, coth, asinh, acosh, atanh, step and rect. Nov 11, 1999: VOG Avoid r1 == 0.0 in log in rang function.