File: headers\mpmath.h

    1 /*
    2  *  REMOVED FORMAL PARAMETERS FROM FUNCTION DEFINITIONS (1/4/92)
    3  */
    4 
    5 
    6 #ifndef MPMATH_H
    7 #define MPMATH_H
    8 
    9 #ifndef _CMPLX_DEFINED
   10 #include "cmplx.h"
   11 #endif
   12 
   13 #ifdef XFRACT
14 #define far
15 #endif 16 17 18 #ifndef XFRACT 19 struct MP { 20 int Exp; 21 unsigned long Mant; 22 };
23 #else 24 struct MP { 25 double val; 26 };
27 #endif 28 29 struct MPC { 30 struct MP x, y; 31 }; 32 33 extern int MPOverflow; 34 extern int DivideOverflow; 35 36 /* Mark Peterson's expanded floating point operators. Automatically uses 37 either the 8086 or 80386 processor type specified in global 'cpu'. If 38 the operation results in an overflow (result < 2**(2**14), or division 39 by zero) the global 'MPoverflow' is set to one. */ 40 41 /* function pointer support added by Tim Wegner 12/07/89 */ 42 extern int (*pMPcmp)(struct MP , struct MP ); 43 extern struct MP *(*pMPmul)(struct MP , struct MP ); 44 extern struct MP *(*pMPdiv)(struct MP , struct MP ); 45 extern struct MP *(*pMPadd)(struct MP , struct MP ); 46 extern struct MP *(*pMPsub)(struct MP , struct MP ); 47 extern struct MP *(*pd2MP)(double ) ; 48 extern double *(*pMP2d)(struct MP ) ; 49 50 51 /*** Formula Declarations ***/ 52 #ifndef XFRACT 53 enum MATH_TYPE { D_MATH, M_MATH, L_MATH };
54 #else 55 enum MATH_TYPE { D_MATH};
56 #endif 57 extern enum MATH_TYPE MathType; 58 59 #define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y)) 60 #define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y)) 61 #define fShift(x, Shift, z) (void)((*(long*)&z) = \ 62 RegSftFloat(*(long*)&x, Shift)) 63 #define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f)) 64 #define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f) 65 #define fLog14(x, z) (void)((*(long*)&z) = \ 66 RegFg2Float(LogFloat14(*(long*)&x), 16)) 67 #define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x)); 68 #define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z) 69 70 /* the following are declared 4 dimensional as an experiment */ 71 /* changeing declarations to _CMPLX and _LCMPLX restores the code */ 72 /* to 2D */ 73 union Arg { 74 _CMPLX d; 75 struct MPC m; 76 _LCMPLX l; 77 /* 78 _DHCMPLX dh; 79 _LHCMPLX lh; */ 80 }; 81 82 struct ConstArg { 83 char *s; 84 int len; 85 union Arg a; 86 }; 87 88 extern union Arg *Arg1,*Arg2; 89 90 extern void lStkSin(void),lStkCos(void),lStkSinh(void),lStkCosh(void),lStkLog(void),lStkExp(void),lStkSqr(void); 91 extern void dStkSin(void),dStkCos(void),dStkSinh(void),dStkCosh(void),dStkLog(void),dStkExp(void),dStkSqr(void); 92 93 extern void (*ltrig0)(void); 94 extern void (*ltrig1)(void); 95 extern void (*ltrig2)(void); 96 extern void (*ltrig3)(void); 97 extern void (*dtrig0)(void); 98 extern void (*dtrig1)(void); 99 extern void (*dtrig2)(void); 100 extern void (*dtrig3)(void); 101 102 /* -------------------------------------------------------------------- */ 103 /* The following #defines allow the complex transcendental functions */ 104 /* in parser.c to be used here thus avoiding duplicated code. */ 105 /* -------------------------------------------------------------------- */ 106 #ifndef XFRACT 107 108 #define CMPLXmod(z) (sqr((z).x)+sqr((z).y)) 109 #define CMPLXconj(z) ((z).y = -((z).y)) 110 #define LCMPLXmod(z) (lsqr((z).x)+lsqr((z).y)) 111 #define LCMPLXconj(z) ((z).y = -((z).y)) 112 113 114 #define LCMPLXtrig0(arg,out) Arg1->l = (arg); ltrig0(); (out)=Arg1->l 115 #define LCMPLXtrig1(arg,out) Arg1->l = (arg); ltrig1(); (out)=Arg1->l 116 #define LCMPLXtrig2(arg,out) Arg1->l = (arg); ltrig2(); (out)=Arg1->l 117 #define LCMPLXtrig3(arg,out) Arg1->l = (arg); ltrig3(); (out)=Arg1->l 118 119 #endif /* XFRACT */ 120 121 #define CMPLXtrig0(arg,out) Arg1->d = (arg); dtrig0(); (out)=Arg1->d 122 #define CMPLXtrig1(arg,out) Arg1->d = (arg); dtrig1(); (out)=Arg1->d 123 #define CMPLXtrig2(arg,out) Arg1->d = (arg); dtrig2(); (out)=Arg1->d 124 #define CMPLXtrig3(arg,out) Arg1->d = (arg); dtrig3(); (out)=Arg1->d 125 126 #ifndef XFRACT 127 128 #define LCMPLXsin(arg,out) Arg1->l = (arg); lStkSin(); (out) = Arg1->l 129 #define LCMPLXcos(arg,out) Arg1->l = (arg); lStkCos(); (out) = Arg1->l 130 #define LCMPLXsinh(arg,out) Arg1->l = (arg); lStkSinh(); (out) = Arg1->l 131 #define LCMPLXcosh(arg,out) Arg1->l = (arg); lStkCosh(); (out) = Arg1->l 132 #define LCMPLXlog(arg,out) Arg1->l = (arg); lStkLog(); (out) = Arg1->l 133 #define LCMPLXexp(arg,out) Arg1->l = (arg); lStkExp(); (out) = Arg1->l 134 /* 135 #define LCMPLXsqr(arg,out) Arg1->l = (arg); lStkSqr(); (out) = Arg1->l 136 */ 137 #define LCMPLXsqr(arg,out) \ 138 (out).x = lsqr((arg).x) - lsqr((arg).y);\ 139 (out).y = multiply((arg).x, (arg).y, bitshiftless1) 140 #define LCMPLXsqr_old(out) \ 141 (out).y = multiply(lold.x, lold.y, bitshiftless1);\ 142 (out).x = ltempsqrx - ltempsqry 143 144 #define LCMPLXpwr(arg1,arg2,out) Arg2->l = (arg1); Arg1->l = (arg2);\ 145 lStkPwr(); Arg1++; Arg2++; (out) = Arg2->l 146 #define LCMPLXmult(arg1,arg2,out) Arg2->l = (arg1); Arg1->l = (arg2);\ 147 lStkMul(); Arg1++; Arg2++; (out) = Arg2->l 148 #define LCMPLXadd(arg1,arg2,out) \ 149 (out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y 150 #define LCMPLXsub(arg1,arg2,out) \ 151 (out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y 152 153 #define LCMPLXtimesreal(arg,real,out) \ 154 (out).x = multiply((arg).x,(real),bitshift);\ 155 (out).y = multiply((arg).y,(real),bitshift) 156 157 #define LCMPLXrecip(arg,out) \ 158 { long denom; denom = lsqr((arg).x) + lsqr((arg).y);\ 159 if(denom==0L) overflow=1; else {(out).x = divide((arg).x,denom,bitshift);\ 160 (out).y = -divide((arg).y,denom,bitshift);}} 161 #endif /* XFRACT */ 162 163 #define CMPLXsin(arg,out) Arg1->d = (arg); dStkSin(); (out) = Arg1->d 164 #define CMPLXcos(arg,out) Arg1->d = (arg); dStkCos(); (out) = Arg1->d 165 #define CMPLXsinh(arg,out) Arg1->d = (arg); dStkSinh(); (out) = Arg1->d 166 #define CMPLXcosh(arg,out) Arg1->d = (arg); dStkCosh(); (out) = Arg1->d 167 #define CMPLXlog(arg,out) Arg1->d = (arg); dStkLog(); (out) = Arg1->d 168 #define CMPLXexp(arg,out) FPUcplxexp(&(arg), &(out)) 169 /* 170 #define CMPLXsqr(arg,out) Arg1->d = (arg); dStkSqr(); (out) = Arg1->d 171 */ 172 #define CMPLXsqr(arg,out) \ 173 (out).x = sqr((arg).x) - sqr((arg).y);\ 174 (out).y = ((arg).x+(arg).x) * (arg).y 175 #define CMPLXsqr_old(out) \ 176 (out).y = (old.x+old.x) * old.y;\ 177 (out).x = tempsqrx - tempsqry 178 179 #define CMPLXpwr(arg1,arg2,out) (out)= ComplexPower((arg1), (arg2)) 180 #define CMPLXmult1(arg1,arg2,out) Arg2->d = (arg1); Arg1->d = (arg2);\ 181 dStkMul(); Arg1++; Arg2++; (out) = Arg2->d 182 #define CMPLXmult(arg1,arg2,out) \ 183 {\ 184 _CMPLX TmP;\ 185 TmP.x = (arg1).x*(arg2).x - (arg1).y*(arg2).y;\ 186 TmP.y = (arg1).x*(arg2).y + (arg1).y*(arg2).x;\ 187 (out) = TmP;\ 188 } 189 #define CMPLXadd(arg1,arg2,out) \ 190 (out).x = (arg1).x + (arg2).x; (out).y = (arg1).y + (arg2).y 191 #define CMPLXsub(arg1,arg2,out) \ 192 (out).x = (arg1).x - (arg2).x; (out).y = (arg1).y - (arg2).y 193 #define CMPLXtimesreal(arg,real,out) \ 194 (out).x = (arg).x*(real);\ 195 (out).y = (arg).y*(real) 196 197 #define CMPLXrecip(arg,out) \ 198 { double denom; denom = sqr((arg).x) + sqr((arg).y);\ 199 if(denom==0.0) {(out).x = 1.0e10;(out).y = 1.0e10;}else\ 200 { (out).x = (arg).x/denom;\ 201 (out).y = -(arg).y/denom;}} 202 203 #define CMPLXneg(arg,out) (out).x = -(arg).x; (out).y = -(arg).y 204 205 #endif 206