#ifndef FMATH_H #define FMATH_H /* FMath.h (C) 1989, Mark C. Peterson, CompuServe [70441,3353] All rights reserved. Code may be used in any program provided the author is credited either during program execution or in the documentation. Source code may be distributed only in combination with public domain or shareware source code. Source code may be modified provided the copyright notice and this message is left unchanged and all modifications are clearly documented. I would appreciate a copy of any work which incorporates this code, however this is optional. Mark C. Peterson 128 Hamden Ave., F Waterbury, CT 06704 (203) 754-1162 Notes below document changes to Mark's original file: Date Change Changer ============================================================ 07-16-89 - Added sqrt define per Mark's suggestion TIW 07-26-89 - Added documentation and complex support MCP */ /***************** * Documentation * ***************** #include "fmath.h" float x, y, z; int Pot, Fudge; 23-bit accuracy (limit of type float) Regular Implementation Fast Math Implementation -------------------------------------------------------------------- z = x + y; fAdd(x, y, z); z = x * y; fMul(x, y, z); z = x * x; fSqr(x, z); z = x / y; fDiv(x, y, z); z = x * 2; fShift(x, 1, z); z = x * 16; fShift(x, 4, z); z = x / 32; fShift(x, -5, z); z = x / (pow(2.0, (double)Pot)); fShift(x, -Pot, z); z = (float)Pot * (1L << Fudge); Fg2Float(Pot, Fudge, z); Pot = (int)(z / (1L << Fudge)); Pot = Float2Fg(z, Fudge); Complex numbers using fComplex structures z = x**2 fSqrZ(&x, &z); mod updated z.mod = (z.x*z.x)+(z.y*z.y) fModZ(&z); mod updated z = 1 / x fInvZ(&x, &z); mod updated z = x * y fMulZ(&x, &y, &z); mod updated z = x / y fDivZ(&x, &y, &z); mod updated 16-bit accuracy Regular Implementation Fast Math Implementation -------------------------------------------------------------------- z = x * y; fMul16(x, y, z); z = x * x; fSqr16(x, z); 14-bit accuracy Regular Implementation Fast Math Implementation -------------------------------------------------------------------- z = log(x); fLog14(x, z); z = exp(x); fExp14(x, z); z = pow(x, y); fPow14(x, y, z); 12-bit accuracy Regular Implementation Fast Math Implementation -------------------------------------------------------------------- z = sin(x); fSin12(x, z); z = cos(x); fCos12(x, z); z = sinh(x); fSinh12(x, z); z = cosh(x); fCosh12(x, z); Complex numbers using fComplex structures z = sin(x) fSinZ(&x, &z); z = cos(x) fCosZ(&x, &z); z = tan(x) fTagZ(&x, &z); z = sinh(x) fSinhZ(&x, &z); z = cosh(x) fCoshZ(&x, &z); z = tanh(x) fCoshZ(&x, &z); Just be sure to declare x, y, and z as type floats instead of type double. */ long #ifndef XFRACT far RegFg2Float(long x, char FudgeFact), far RegSftFloat(long x, char Shift), #else far RegFg2Float(long x, int FudgeFact), far RegSftFloat(long x, int Shift), #endif far RegFloat2Fg(long x, int Fudge), far RegAddFloat(long x, long y), far RegDivFloat(long x, long y), far RegMulFloat(long x, long y), far RegSqrFloat(long x), far RegSubFloat(long x, long y); long far r16Mul(long x, long y), far r16Sqr(long x); int far sin13(long x), far cos13(long x), far FastCosine(int x), far FastSine(int x); long far FastHypCosine(int x), far FastHypSine(int x), far sinh13(long x), far cosh13(long x); long far LogFudged(unsigned long x, int Fudge); long far LogFloat14(unsigned long x); unsigned long far ExpFudged(long x, int Fudge); long far ExpFloat14(long x); #define fAdd(x, y, z) (void)((*(long*)&z) = RegAddFloat(*(long*)&x, *(long*)&y)) #define fMul(x, y, z) (void)((*(long*)&z) = RegMulFloat(*(long*)&x, *(long*)&y)) #define fDiv(x, y, z) (void)((*(long*)&z) = RegDivFloat(*(long*)&x, *(long*)&y)) #define fSub(x, y, z) (void)((*(long*)&z) = RegSubFloat(*(long*)&x, *(long*)&y)) #define fMul16(x, y, z) (void)((*(long*)&z) = r16Mul(*(long*)&x, *(long*)&y)) #define fSqr16(x, z) (void)((*(long*)&z) = r16Sqr(*(long*)&x)) #define fSqr(x, z) (void)((*(long*)&z) = RegSqrFloat(*(long*)&x)) #define fShift(x, Shift, z) (void)((*(long*)&z) = \ RegSftFloat(*(long*)&x, Shift)) #define Fg2Float(x, f, z) (void)((*(long*)&z) = RegFg2Float(x, f)) #define Float2Fg(x, f) RegFloat2Fg(*(long*)&x, f) #define fSin12(x, z) (void)((*(long*)&z) = \ RegFg2Float((long)sin13(Float2Fg(x, 13)), 13)) #define fCos12(x, z) (void)((*(long*)&z) = \ RegFg2Float((long)cos13(Float2Fg(x, 13)), 13)) #define fSinh12(x, z) (void)((*(long*)&z) = \ RegFg2Float(sinh13(Float2Fg(x, 13)), 13)) #define fCosh12(x, z) (void)((*(long*)&z) = \ RegFg2Float(cosh13(Float2Fg(x, 13)), 13)) #define fLog14(x, z) (void)((*(long*)&z) = \ RegFg2Float(LogFloat14(*(long*)&x), 16)) #define fExp14(x, z) (void)((*(long*)&z) = ExpFloat14(*(long*)&x)); #define fPow14(x, y, z) fLog14(x, z); fMul16(z, y, z); fExp14(z, z) #define fSqrt14(x, z) fLog14(x, z); fShift(z, -1, z); fExp14(z, z) struct fComplex { float x, y, mod; }; void fSqrZ(struct fComplex *x, struct fComplex *z), fMod(struct fComplex *x), fInvZ(struct fComplex *x, struct fComplex *z), fMulZ(struct fComplex *x, struct fComplex *y, struct fComplex *z), fDivZ(struct fComplex *x, struct fComplex *y, struct fComplex *z), fSinZ(struct fComplex *x, struct fComplex *z), fCosZ(struct fComplex *x, struct fComplex *z), fTanZ(struct fComplex *x, struct fComplex *z), fSinhZ(struct fComplex *x, struct fComplex *z), fCoshZ(struct fComplex *x, struct fComplex *z), fTanhZ(struct fComplex *x, struct fComplex *z); #endif