#ifndef MATH_H
#define MATH_H

#include <p2c/p2c.h>
#include <p2c/newasm.h>

#ifdef MATH_G
# define vextern
#else
# define vextern extern
#endif


typedef struct ma_complex {
    double re, im;
} ma_complex;


#define ma_maxreal      1.797073134862315e308
#define ma_eps          1.110765125711e-16
#define ma_maxreal_     ma_maxreal
#define ma_minreal      (-ma_maxreal)
#define ma_pi           3.1415926535897932384
#define ma_2pi          6.2831853071795864768
#define ma_hpi          1.5707963267948966192
#define ma_ln10         2.3025850929940456840
#define ma_iln10        0.4342944819032518277
#define ma_dr           0.0174532925199433
#define ma_rd           57.2957795130823

vextern const ma_complex ma_c0;
vextern const ma_complex ma_c1;
vextern const ma_complex ma_cm1;
vextern const ma_complex ma_cI;
vextern const ma_complex ma_cmI;
vextern const ma_complex ma_cpi;

#define ma_fmt_vprec    1
#define ma_fmt_usej     2
#define ma_fmt_usespace 4
#define ma_fmt_useparen 8

vextern long ma_dummy;


/* obsolete -- use initrandom/seedrandom */
extern int ma_trapuf (int flag) DEPRECATED;
extern double ma_rround (double r);
extern double ma_rrounde (double r);
extern double ma_rtrunc (double r);
extern double ma_rfloor (double r);
extern double ma_rceil (double r);
extern double ma_rfrac (double r);
extern int ma_isint (double r);
extern int ma_isinteger (double r);
extern int ma_rnequal (double a, double b, double eps);
extern long ma_igcd (long a, long b);
extern double ma_rmod (double a, double b);
extern double ma_rmod2 (double a, double b, long *q);
extern double ma_rrem (double a, double b);
extern double rrem_ieee (double a, double b);
extern long ma_sgn (double r);
extern double ma_sgn2 (double r, double s);
extern double ma_min2 (double a, double b);
extern double ma_min3 (double a, double b, double c);
extern double ma_min4 (double a, double b, double c, double d);
extern double ma_max2 (double a, double b);
extern double ma_max3 (double a, double b, double c);
extern double ma_max4 (double a, double b, double c, double d);
extern double ma_mean2 (double a, double b);
extern double ma_mean3 (double a, double b, double c);
extern double ma_mean4 (double a, double b, double c, double d);
extern void ma_rswap2 (double *a, double *b);
extern void ma_rsort2 (double *a, double *b);
extern void ma_rsort3 (double *a, double *b, double *c);
extern void ma_rsort4 (double *a, double *b, double *c, double *d);
extern double ma_rbound (double min, double r, double max);
extern int ma_between (double min, double r, double max);
extern int ma_betweenm (double min, double r, double max,
			       double margin);
extern void ma_amin (double *min, double r);
extern void ma_amax (double *max, double r);
extern void ma_aminmax (double *min, double *max, double r);
extern double ma_rsucc (double r);
extern double ma_rpred (double r);
extern char *ma_strfmtreal (char *ma_Result, double r, long wid, long prec);
extern char *ma_strfmtreal2 (char *ma_Result, double r, long wid,
				long prec, long flags, double min,
				double max);
extern double ma_log (double r);
extern double ma_tentox (double x);
extern double ma_mtentox (double x);
extern double ma_ytoi (double y, long i);
extern double ma_yrooti (double y, long i);
extern double ma_ytox (double y, double x);
extern double ma_mytox (double y, double x);
extern double ma_hypot (double a, double b);
extern void ma_quadrsolve (double a, double b, double c, double *x1,
			      double *x2);
extern void ma_sincos (double r, double *s, double *c);
extern double ma_tan (double r) DEPRECATED; /* Use tan */
extern double ma_arcsin (double r) DEPRECATED; /* use asin */
extern double ma_arccos (double r) DEPRECATED; /* use acos */
extern double ma_arctan2 (double r1, double r2) DEPRECATED ; /* use atan2 */

/* = arctan(r1/r2) */
extern void ma_sincosd (double r, double *s, double *c);
extern double ma_sind (double r);
extern double ma_cosd (double r);
extern double ma_tand (double r);
extern double ma_arcsind (double r);
extern double ma_arccosd (double r);
extern double ma_arctand (double r);
extern double ma_arctand2 (double r1, double r2);
extern double ma_sinh (double r) DEPRECATED; /* use sinh */
extern double ma_cosh (double r) DEPRECATED; /* use cosh */
extern double ma_tanh (double r) DEPRECATED; /* use tanh */
extern double ma_arcsinh (double r) DEPRECATED; /* use asinh */
extern double ma_arccosh (double r) DEPRECATED; /* use acosh */
extern double ma_arctanh (double r) DEPRECATED; /* use atanh */
extern double ma_lngamma (double x, int *minus);
extern double ma_rgamma (double x);
extern long ma_ifactorial (long n);
extern double ma_lnfactorial (long n);
extern long ma_ibincoef (long a, long b);

/*a >= b*/
extern double ma_rbincoef (long a, long b);
extern ma_complex ma_cmake (double r, double i);
extern ma_complex ma_creal (double r);
extern ma_complex ma_cimag (double i);
extern ma_complex ma_cadd (ma_complex a, ma_complex b);
extern ma_complex ma_csub (ma_complex a, ma_complex b);
extern ma_complex ma_cmul (ma_complex a, ma_complex b);
extern ma_complex ma_cdiv (ma_complex a, ma_complex b);
extern ma_complex ma_csqr (ma_complex a);
extern ma_complex ma_csqrt (ma_complex a);
extern int ma_cequal (ma_complex a, ma_complex b);
extern int ma_cnequal (ma_complex a, ma_complex b, double epssq);
extern ma_complex ma_csmul (double r, ma_complex a);
extern ma_complex ma_cconj (ma_complex a);
extern ma_complex ma_cneg (ma_complex a);
extern double ma_cangle (ma_complex a);
extern double ma_cabs (ma_complex a);
extern double ma_cabssqr (ma_complex a);
extern double ma_cdiff (ma_complex a, ma_complex b);
extern ma_complex ma_cexp (ma_complex a);
extern ma_complex ma_cexpi (ma_complex a);
extern ma_complex ma_cln (ma_complex a);
extern ma_complex ma_csin (ma_complex a);
extern ma_complex ma_ccos (ma_complex a);
extern ma_complex ma_ctan (ma_complex a);
extern ma_complex ma_carcsin (ma_complex a);
extern ma_complex ma_carccos (ma_complex a);
extern ma_complex ma_carctan (ma_complex a);
extern ma_complex ma_csinh (ma_complex a);
extern ma_complex ma_ccosh (ma_complex a);
extern ma_complex ma_ctanh (ma_complex a);
extern ma_complex ma_carcsinh (ma_complex a);
extern ma_complex ma_carccosh (ma_complex a);
extern ma_complex ma_carctanh (ma_complex a);
extern char *ma_strcomplex (char *ma_Result, ma_complex a);
extern char *ma_strfmtcomplex (char *ma_Result, ma_complex a, long wid,
				  long prec);
extern char *ma_strfmtcomplex2 (char *ma_Result, ma_complex a, long wid,
				   long prec, long flags, double min,
				   double max);
extern void ma_strsubreadcomplex (char *buf, long first, long *pos,
				     ma_complex *a);
extern ma_complex ma_strreadcomplex (char *buf);
extern double ma_rrand () DEPRECATED;
extern long ma_rand2 (long min, long max) DEPRECATED;
extern double ma_rrand2 (double min, double max) DEPRECATED;
extern double ma_nrand2 (double mean, double sdev) DEPRECATED;
extern void ma_initrandom (void * *s) DEPRECATED;
extern void ma_seedrandom (void * *s, long seed) DEPRECATED;
extern double ma_urandom (void * s) DEPRECATED;
extern long ma_irandom (void * s, long min, long max) DEPRECATED;
extern double ma_rrandom (void * s, double min, double max) DEPRECATED;
extern double ma_nrandom (void * s, double mean, double sdev) DEPRECATED;


#undef vextern

#endif /*MATH_H*/

/* End. */