home *** CD-ROM | disk | FTP | other *** search
/ Mega A/V / mega_av.zip / mega_av / GRAPHUTL / FRASR172.ZIP / MPMATH.H < prev    next >
C/C++ Source or Header  |  1991-07-07  |  5KB  |  152 lines

  1. #ifndef MPMATH_H
  2. #define MPMATH_H
  3.  
  4. #include <math.h>
  5.  
  6. struct MP {
  7.    int Exp;
  8.         unsigned long Mant;
  9. };
  10.  
  11. struct MPC {
  12.         struct MP x, y;
  13. };
  14.  
  15. extern struct MP MPTrigTable[2][4][256], InvHalfPi, HalfPi, InvLn2, Ln2;
  16. extern int MPaccuracy, MPOverflow;
  17.  
  18. /* Mark Peterson's expanded floating point operators.  Automatically uses
  19.    either the 8086 or 80386 processor type specified in global 'cpu'. If
  20.    the operation results in an overflow (result < 2**(2**14), or division
  21.    by zero) the global 'MPoverflow' is set to one. */
  22.  
  23. extern int cpu;
  24.  
  25. struct MP *MPmul(struct MP x, struct MP y);
  26. struct MP *MPdiv(struct MP x, struct MP y);
  27. struct MP *MPadd(struct MP x, struct MP y);
  28. struct MP *MPsub(struct MP x, struct MP y);
  29. struct MP *MPabs(struct MP x);
  30. struct MP *d2MP(double x);  /* Convert double to type MP */
  31. double *MP2d(struct MP m);  /* Convert type MP to double */
  32. struct MP *fg2MP(long x, int fg); /* Convert fudged to type MP */
  33.  
  34.  
  35. int MPcmp(struct MP x, struct MP y);
  36. /* return = -1 if x < y
  37.           = 0 if x == y
  38.           = 1 if x > y */
  39.  
  40. /* Mark Peterson's complex expanded floating point operators */
  41. struct MPC MPCmul(struct MPC x, struct MPC y);
  42. struct MPC MPCdiv(struct MPC x, struct MPC y);
  43. struct MPC MPCadd(struct MPC x, struct MPC y);
  44. struct MPC MPCsub(struct MPC x, struct MPC y);
  45. int MPCcmp(struct MPC x, struct MPC y);
  46. struct MPC MPCpow(struct MPC x, int exp);
  47. struct MPC MPCsqr(struct MPC x);
  48. struct MP MPCmod(struct MPC x);
  49. struct complex MPC2cmplx(struct MPC x);
  50. struct MPC cmplx2MPC(struct complex z);
  51.  
  52. /* Prototypes for direct calling of processor specific routines */
  53. struct MP *MPmul086(struct MP x, struct MP y);
  54. struct MP *MPdiv086(struct MP x, struct MP y);
  55. struct MP *MPadd086(struct MP x, struct MP y);
  56. struct MP *MPsub086(struct MP x, struct MP y);
  57. int MPcmp086(struct MP x, struct MP y);
  58. struct MP *d2MP086(double x);
  59. double *MP2d086(struct MP m);
  60. struct MP *fg2MP086(long x, int fg);
  61.  
  62. struct MP *MPmul386(struct MP x, struct MP y);
  63. struct MP *MPdiv386(struct MP x, struct MP y);
  64. struct MP *MPadd386(struct MP x, struct MP y);
  65. struct MP *MPsub386(struct MP x, struct MP y);
  66. int MPcmp386(struct MP x, struct MP y);
  67. struct MP *d2MP386(double x);
  68. double *MP2d386(struct MP m);
  69. struct MP *fg2MP386(long x, int fg);
  70.  
  71. /* function pointer support added by Tim Wegner 12/07/89 */
  72. extern int        (*pMPcmp)(struct MP x, struct MP y);
  73. extern struct MP  *(*pMPmul)(struct MP x, struct MP y);
  74. extern struct MP  *(*pMPdiv)(struct MP x, struct MP y);
  75. extern struct MP  *(*pMPadd)(struct MP x, struct MP y);
  76. extern struct MP  *(*pMPsub)(struct MP x, struct MP y);
  77. extern struct MP  *(*pd2MP)(double x)                 ;
  78. extern double *   (*pMP2d)(struct MP m)              ;
  79. void setMPfunctions(void);
  80.  
  81.  
  82. /* FPU routines */
  83. extern void FPUaptan387(double *y, double *x, double *atan);
  84. extern void FPUcplxmul(struct complex *x, struct complex *y,
  85.                                                           struct complex *z);
  86. extern void FPUcplxdiv(struct complex *x, struct complex *y,
  87.                                                           struct complex *z);
  88. extern void FPUsincos(double *Angle, double *Sin, double *Cos);
  89. extern void FPUsinhcosh(double *Angle, double *Sinh, double *Cosh);
  90. extern void FPUcplxlog(struct complex *x, struct complex *z);
  91. extern void FPUcplxexp387(struct complex *x, struct complex *z);
  92. extern struct complex ComplexPower(struct complex x, struct complex y);
  93.  
  94. /* Integer Routines */
  95. void SinCos086(long x, long *sinx, long *cosx);
  96. void SinhCosh086(long x, long *sinx, long *cosx);
  97.  
  98. /*** Formula Declarations ***/
  99. typedef enum { D_MATH, M_MATH, L_MATH } MATH_TYPE;
  100. extern MATH_TYPE MathType;
  101.  
  102. int ParseStr(char *Str);
  103. int Formula(void);
  104. int form_per_pixel(void);
  105. int fpFormulaSetup(void);
  106. int mpcFormulaSetup(void);
  107. int intFormulaSetup(void);
  108. /* char *FormStr, *FormName;    BDT commented these out */
  109.  
  110. long
  111.    far RegFg2Float(long x, char FudgeFact),
  112.    far RegFloat2Fg(long x, int Fudge),
  113.    far RegDivFloat(long x, long y),
  114.    far RegSftFloat(long x, char Shift),
  115.    far r16Mul(long x, long y),
  116.    far LogFudged(unsigned long x, int Fudge),
  117.    far LogFloat14(unsigned long x),
  118.    far ExpFloat14(long x);
  119.  
  120. unsigned long far ExpFudged(long x, int Fudge);
  121.  
  122. #define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y))
  123. #define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y))
  124. #define fShift(x, Shift, z) (void)((*(long*)&z) = \
  125.    RegSftFloat(*(long*)&x, Shift))
  126. #define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f))
  127. #define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f)
  128. #define fLog14(x, z) (void)((*(long*)&z) = \
  129.         RegFg2Float(LogFloat14(*(long*)&x), 16))
  130. #define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x));
  131. #define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z)
  132.  
  133. #ifndef _LCOMPLEX_DEFINED
  134. struct lcomplex {
  135.    long x, y;
  136. };
  137. #define _LCOMPLEX_DEFINED
  138. #endif
  139.  
  140. union Arg {
  141.    struct complex d;
  142.    struct MPC m;
  143.    struct lcomplex l;
  144. };
  145.  
  146. extern union Arg *Arg1,*Arg2;
  147.  
  148. extern void lStkSin(),lStkCos(),lStkSinh(),lStkCosh(),lStkLog(),lStkExp(),lStkSqr();
  149. extern void dStkSin(),dStkCos(),dStkSinh(),dStkCosh(),dStkLog(),dStkExp(),dStkSqr();
  150.  
  151. #endif
  152.