1 #ifndef FMATH_H 2 #define FMATH_H 3 4 /* FMath.h (C) 1989, Mark C. Peterson, CompuServe [70441,3353] 5 All rights reserved. 6 7 Code may be used in any program provided the author is credited 8 either during program execution or in the documentation. Source 9 code may be distributed only in combination with public domain or 10 shareware source code. Source code may be modified provided the 11 copyright notice and this message is left unchanged and all 12 modifications are clearly documented. 13 14 I would appreciate a copy of any work which incorporates this code, 15 however this is optional. 16 17 Mark C. Peterson 18 128 Hamden Ave., F 19 Waterbury, CT 06704 20 (203) 754-1162 21 22 Notes below document changes to Mark's original file: 23 24 Date Change Changer 25 ============================================================ 26 07-16-89 - Added sqrt define per Mark's suggestion TIW 27 07-26-89 - Added documentation and complex support MCP 28 */ 29 30 /***************** 31 * Documentation * 32 ***************** 33 34 #include "fmath.h" 35 float x, y, z; 36 int Pot, Fudge; 37 38 23-bit accuracy (limit of type float) 39 Regular Implementation Fast Math Implementation 40 -------------------------------------------------------------------- 41 z = x + y; fAdd(x, y, z); 42 z = x * y; fMul(x, y, z); 43 z = x * x; fSqr(x, z); 44 z = x / y; fDiv(x, y, z); 45 z = x * 2; fShift(x, 1, z); 46 z = x * 16; fShift(x, 4, z); 47 z = x / 32; fShift(x, -5, z); 48 z = x / (pow(2.0, (double)Pot)); fShift(x, -Pot, z); 49 z = (float)Pot * (1L << Fudge); Fg2Float(Pot, Fudge, z); 50 Pot = (int)(z / (1L << Fudge)); Pot = Float2Fg(z, Fudge); 51 52 Complex numbers using fComplex structures 53 z = x**2 fSqrZ(&x, &z); mod updated 54 z.mod = (z.x*z.x)+(z.y*z.y) fModZ(&z); mod updated 55 z = 1 / x fInvZ(&x, &z); mod updated 56 z = x * y fMulZ(&x, &y, &z); mod updated 57 z = x / y fDivZ(&x, &y, &z); mod updated 58 59 16-bit accuracy 60 Regular Implementation Fast Math Implementation 61 -------------------------------------------------------------------- 62 z = x * y; fMul16(x, y, z); 63 z = x * x; fSqr16(x, z); 64 65 14-bit accuracy 66 Regular Implementation Fast Math Implementation 67 -------------------------------------------------------------------- 68 z = log(x); fLog14(x, z); 69 z = exp(x); fExp14(x, z); 70 z = pow(x, y); fPow14(x, y, z); 71 72 12-bit accuracy 73 Regular Implementation Fast Math Implementation 74 -------------------------------------------------------------------- 75 z = sin(x); fSin12(x, z); 76 z = cos(x); fCos12(x, z); 77 z = sinh(x); fSinh12(x, z); 78 z = cosh(x); fCosh12(x, z); 79 80 Complex numbers using fComplex structures 81 z = sin(x) fSinZ(&x, &z); 82 z = cos(x) fCosZ(&x, &z); 83 z = tan(x) fTagZ(&x, &z); 84 z = sinh(x) fSinhZ(&x, &z); 85 z = cosh(x) fCoshZ(&x, &z); 86 z = tanh(x) fCoshZ(&x, &z); 87 88 Just be sure to declare x, y, and z as type floats instead of type double. 89 */ 90 91 long 92 #ifndef XFRACT 93 far RegFg2Float(long x, char FudgeFact), 94 far RegSftFloat(long x, char Shift), 95 #else 96 far RegFg2Float(long x, int FudgeFact), 97 far RegSftFloat(long x, int Shift), 98 #endif 99 far RegFloat2Fg(long x, int Fudge), 100 far RegAddFloat(long x, long y), 101 far RegDivFloat(long x, long y), 102 far RegMulFloat(long x, long y), 103 far RegSqrFloat(long x), 104 far RegSubFloat(long x, long y); 105 long 106 far r16Mul(long x, long y), 107 far r16Sqr(long x); 108 int 109 far sin13(long x), 110 far cos13(long x), 111 far FastCosine(int x), 112 far FastSine(int x); 113 long 114 far FastHypCosine(int x), 115 far FastHypSine(int x), 116 far sinh13(long x), 117 far cosh13(long x); 118 long far LogFudged(unsigned long x, int Fudge); 119 long far LogFloat14(unsigned long x); 120 unsigned long far ExpFudged(long x, int Fudge); 121 long far ExpFloat14(long x); 122 123 #define fAdd(x, y, z) (void)((*(long*)&z) = RegAddFloat(*(long*)&x, *(long*)&y)) 124 #define fMul(x, y, z) (void)((*(long*)&z) = RegMulFloat(*(long*)&x, *(long*)&y)) 125 #define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y)) 126 #define fSub(x, y, z) (void)((*(long*)&z) = RegSubFloat(*(long*)&x, *(long*)&y)) 127 #define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y)) 128 #define fSqr16(x, z) (void)((*(long*)&z) = r16Sqr(*(long*)&x)) 129 #define fSqr(x, z) (void)((*(long*)&z) = RegSqrFloat(*(long*)&x)) 130 #define fShift(x, Shift, z) (void)((*(long*)&z) = \ 131 RegSftFloat(*(long*)&x, Shift)) 132 #define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f)) 133 #define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f) 134 #define fSin12(x, z) (void)((*(long*)&z) = \ 135 RegFg2Float((long)sin13(Float2Fg(x, 13)), 13)) 136 #define fCos12(x, z) (void)((*(long*)&z) = \ 137 RegFg2Float((long)cos13(Float2Fg(x, 13)), 13)) 138 #define fSinh12(x, z) (void)((*(long*)&z) = \ 139 RegFg2Float(sinh13(Float2Fg(x, 13)), 13)) 140 #define fCosh12(x, z) (void)((*(long*)&z) = \ 141 RegFg2Float(cosh13(Float2Fg(x, 13)), 13)) 142 #define fLog14(x, z) (void)((*(long*)&z) = \ 143 RegFg2Float(LogFloat14(*(long*)&x), 16)) 144 #define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x)); 145 #define fPow14(x, y, z) fLog14(x, z); fMul16(z, y, z); fExp14(z, z) 146 #define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z) 147 148 struct fComplex { 149 float x, y, mod; 150 }; 151 152 void 153 fSqrZ(struct fComplex *x, struct fComplex *z), 154 fMod(struct fComplex *x), 155 fInvZ(struct fComplex *x, struct fComplex *z), 156 fMulZ(struct fComplex *x, struct fComplex *y, struct fComplex *z), 157 fDivZ(struct fComplex *x, struct fComplex *y, struct fComplex *z), 158 fSinZ(struct fComplex *x, struct fComplex *z), 159 fCosZ(struct fComplex *x, struct fComplex *z), 160 fTanZ(struct fComplex *x, struct fComplex *z), 161 fSinhZ(struct fComplex *x, struct fComplex *z), 162 fCoshZ(struct fComplex *x, struct fComplex *z), 163 fTanhZ(struct fComplex *x, struct fComplex *z); 164 165 #endif 166