Updated PCI IDs to latest snapshot.
[tangerine.git] / workbench / libs / mathtrans / spcos.c
blobcdf87888839bc436fc6131908d9cb1421020a388
1 /*
2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include "mathtrans_intern.h"
8 /*
9 FUNCTION
10 Calculate the cosine of a given ffp number in radians
12 RESULT
13 Motorola fast floating point number
15 flags:
16 zero : result is zero
17 negative : result is negative
18 overflow : 0
20 NOTES
22 EXAMPLE
24 BUGS
26 SEE ALSO
28 INTERNALS
29 Algorithm for Calculation of cos(y):
30 <code>
31 z = floor ( |y| / pi );
32 y_1 = |y| - z * pi; => 0 <= y_1 < pi
34 if (y_1 > pi/2 ) then y_1 = pi - y_1;
36 => 0 <= y_1 < pi/2
38 Res = 1 - y^2/2! + y^4/4! - y^6/6! + y^8/8! - y^10/10! =
39 = 1 -(y^2(-1/2!+y^2(1/4!+y^2(-1/6!+y^2(1/8!-1/10!y^2)))));
41 if (z was an odd number)
42 Res = -Res;
44 if (y_1 was greater than pi/2 in the test above)
45 Res = -Res;
46 </code>
49 HISTORY
52 AROS_LH1(float, SPCos,
53 AROS_LHA(float, fnum1, D0),
54 struct Library *, MathTransBase, 7, MathTrans
57 AROS_LIBFUNC_INIT
59 LONG z,Res,ysquared,yabs,tmp;
60 yabs = fnum1 & (FFPMantisse_Mask + FFPExponent_Mask);
62 if ((LONG)FFP_Pinfty == yabs)
64 SetSR(Overflow_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
65 return FFP_NAN;
68 z = SPFloor(SPDiv(pi, yabs));
69 tmp = SPMul(z,pi);
70 tmp |= FFPSign_Mask; /* tmp = -tmp; */
71 yabs = SPAdd(yabs, tmp);
73 if
75 (char)yabs > (char)pio2
76 && (yabs & FFPMantisse_Mask) > (pio2 & FFPMantisse_Mask)
79 yabs |= FFPSign_Mask;
80 yabs =SPAdd(pi, yabs);
81 tmp = TRUE;
83 else
85 tmp = FALSE;
88 ysquared = SPMul(yabs,yabs);
89 Res = SPAdd(cosf1,
90 SPMul(ysquared,
91 SPAdd(cosf2,
92 SPMul(ysquared,
93 SPAdd(cosf3,
94 SPMul(ysquared,
95 SPAdd(cosf4,
96 SPMul(ysquared,
97 SPAdd(cosf5,
98 SPMul(ysquared, cosf6))))))))));
100 if (0 == Res)
102 SetSR(Zero_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
103 return 0;
106 if (TRUE == intern_SPisodd(z)) Res ^= FFPSign_Mask;
108 if (TRUE == tmp) Res ^= FFPSign_Mask;
110 if ((char)Res < 0) SetSR(Negative_Bit, Zero_Bit | Negative_Bit | Overflow_Bit);
112 return Res;
114 AROS_LIBFUNC_EXIT