2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
6 #include "mathtrans_intern.h"
8 /*****************************************************************************
12 AROS_LH1(float, SPCos
,
15 AROS_LHA(float, fnum1
, D0
),
18 struct Library
*, MathTransBase
, 7, MathTrans
)
21 Calculate the cosine of a given ffp number in radians
26 Motorola fast floating point number
30 negative : result is negative
36 Algorithm for Calculation of cos(y):
38 z = floor ( |y| / pi );
39 y_1 = |y| - z * pi; => 0 <= y_1 < pi
41 if (y_1 > pi/2 ) then y_1 = pi - y_1;
45 Res = 1 - y^2/2! + y^4/4! - y^6/6! + y^8/8! - y^10/10! =
46 = 1 -(y^2(-1/2!+y^2(1/4!+y^2(-1/6!+y^2(1/8!-1/10!y^2)))));
48 if (z was an odd number)
51 if (y_1 was greater than pi/2 in the test above)
54 *****************************************************************************/
58 LONG z
,Res
,ysquared
,yabs
,tmp
;
59 yabs
= fnum1
& (FFPMantisse_Mask
+ FFPExponent_Mask
);
61 if ((LONG
)FFP_Pinfty
== yabs
)
63 SetSR(Overflow_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
67 z
= SPFloor(SPDiv(pi
, yabs
));
69 tmp
|= FFPSign_Mask
; /* tmp = -tmp; */
70 yabs
= SPAdd(yabs
, tmp
);
74 (char)yabs
> (char)pio2
75 && (yabs
& FFPMantisse_Mask
) > (pio2
& FFPMantisse_Mask
)
79 yabs
=SPAdd(pi
, yabs
);
87 ysquared
= SPMul(yabs
,yabs
);
97 SPMul(ysquared
, cosf6
))))))))));
101 SetSR(Zero_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
105 if (TRUE
== intern_SPisodd(z
)) Res
^= FFPSign_Mask
;
107 if (TRUE
== tmp
) Res
^= FFPSign_Mask
;
109 if ((char)Res
< 0) SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);