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    { LDBL 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