muimaster.library: Area class will not eat wheel movement messages
[AROS.git] / workbench / libs / mathtrans / sptan.c
blob8b873bdb322beba59f7ec46642b9bd384b93ef55
1 /*
2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include "mathtrans_intern.h"
8 /*****************************************************************************
10 NAME */
12 AROS_LH1(float, SPTan,
14 /* SYNOPSIS */
15 AROS_LHA(float, fnum1, D0),
17 /* LOCATION */
18 struct Library *, MathTransBase, 8, MathTrans)
20 /* FUNCTION
21 Calculate the tangens of a given FFP number in radians
23 INPUTS
25 RESULT
26 Motorola fast floating point number
28 flags:
29 zero : result is zero
30 negative : result is negative
31 overflow :
33 BUGS
35 INTERNALS
37 *****************************************************************************/
39 AROS_LIBFUNC_INIT
41 LONG z,SIN,Res,ysquared,yabs,tmp;
42 yabs = fnum1 & (FFPMantisse_Mask + FFPExponent_Mask);
44 if ((LONG)FFP_Pinfty == yabs)
46 SetSR(Overflow_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
47 return FFP_NAN;
50 z = SPFloor(SPDiv(pi, yabs));
51 tmp = SPMul(z,pi);
52 tmp |= FFPSign_Mask; /* tmp = -tmp; */
53 yabs = SPAdd(yabs, tmp);
55 if ( (char)yabs > (char)pio2 && (yabs & FFPMantisse_Mask) > (pio2 & FFPMantisse_Mask) )
57 yabs |= FFPSign_Mask;
58 yabs =SPAdd(pi, yabs);
59 tmp = TRUE;
61 else
63 tmp = FALSE;
66 ysquared = SPMul(yabs,yabs);
67 SIN = SPMul(yabs,
68 SPAdd(sinf1,
69 SPMul(ysquared,
70 SPAdd(sinf2,
71 SPMul(ysquared,
72 SPAdd(sinf3,
73 SPMul(ysquared,
74 SPAdd(sinf4,
75 SPMul(ysquared,
76 SPAdd(sinf5,
77 SPMul(ysquared, sinf6)))))))))));
78 /* cos */
79 z = SPAdd(cosf1,
80 SPMul(ysquared,
81 SPAdd(cosf2,
82 SPMul(ysquared,
83 SPAdd(cosf3,
84 SPMul(ysquared,
85 SPAdd(cosf4,
86 SPMul(ysquared,
87 SPAdd(cosf5,
88 SPMul(ysquared, cosf6))))))))));
90 Res = SPDiv(z, SIN);
92 if ((char)fnum1 < 0 ) Res ^= FFPSign_Mask;
93 if (TRUE == tmp) Res ^= FFPSign_Mask;
95 if (0 == Res)
97 SetSR(Zero_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
98 return 0;
101 if ((char)Res < 0)
103 SetSR(Negative_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
106 return Res;
108 AROS_LIBFUNC_EXIT