/* Fpu087.c * This file contains routines to replace fpu087.asm. * * This file Copyright 1991 Ken Shirriff. It may be used according to the * fractint license conditions, blah blah blah. */ #include "port.h" #include "prototyp.h" /* *---------------------------------------------------------------------- * * xxx086 -- * * Simulate integer math routines using floating point. * This will of course slow things down, so this should all be * changed at some point. * *---------------------------------------------------------------------- */ double _2_ = 2.0; double _1_ = 1.0; double PointFive = 0.5; void FPUaptan387(double *y, double *x, double *atan) { *atan = atan2(*y,*x); } void FPUcplxmul(_CMPLX *x, _CMPLX *y, _CMPLX *z) { double tx; tx = x->x * y->x - x->y * y->y; z->y = x->x * y->y + x->y * y->x; z->x = tx; } void FPUcplxdiv(_CMPLX *x, _CMPLX *y, _CMPLX *z) { double mod,tx,yxmod,yymod, yx, yy; yx = y->x; yy = y->y; mod = yx * yx + yy * yy; if (mod == 0.0) overflow = 1; else { yxmod = yx/mod; yymod = - yy/mod; tx = x->x * yxmod - x->y * yymod; z->y = x->x * yymod + x->y * yxmod; z->x = tx; } } void FPUsincos(double *Angle, double *Sin, double *Cos) { *Sin = sin(*Angle); *Cos = cos(*Angle); } void FPUsinhcosh(double *Angle, double *Sinh, double *Cosh) { *Sinh = sinh(*Angle); *Cosh = cosh(*Angle); } void FPUcplxlog(_CMPLX *x, _CMPLX *z) { double mod, xx, xy; xx = x->x; xy = x->y; if (xx == 0.0 && xy == 0.0) { z->x = z->y = 0.0; return; } mod = xx*xx + xy*xy; z->x = 0.5 * log(mod); z->y = atan2(xy,xx); } void FPUcplxexp387(_CMPLX *x, _CMPLX *z) { double pow,y; y = x->y; pow = exp(x->x); z->x = pow*cos(y); z->y = pow*sin(y); } /* Integer Routines */ void SinCos086(long x, long *sinx, long *cosx) { double a; a = x/(double)(1<<16); *sinx = (long) (sin(a)*(double)(1<<16)); *cosx = (long) (cos(a)*(double)(1<<16)); } void SinhCosh086(long x, long *sinx, long *cosx) { double a; a = x/(double)(1<<16); *sinx = (long) (sinh(a)*(double)(1<<16)); *cosx = (long) (cosh(a)*(double)(1<<16)); } long Exp086(x) long x; { return (long) (exp((double)x/(double)(1<<16))*(double)(1<<16)); } #define em2float(l) (*(float *)&(l)) #define float2em(f) (*(long *)&(f)) /* * Input is a 16 bit offset number. Output is shifted by Fudge. */ unsigned long ExpFudged(x, Fudge) long x; int Fudge; { return (long) (exp((double)x/(double)(1<<16))*(double)(1<0) { f *= (1 << Shift); } else { f /= (1 << -Shift); } return float2em(f); }