2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
6 #include "mathieeesingtrans_intern.h"
10 Calculate the cosine of a given IEEE single precision number in radians
13 IEEE single precision floating point number
17 negative : result is negative
29 Algorithm for Calculation of cos(y):
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;
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)
44 if (y_1 was greater than pi/2 in the test above)
52 AROS_LH1(float, IEEESPCos
,
53 AROS_LHA(float, y
, D0
),
54 struct Library
*, MathIeeeSingTransBase
, 7, MathIeeeSingTrans
59 LONG z
,Res
,ysquared
,yabs
,tmp
;
60 yabs
= y
& (IEEESPMantisse_Mask
+ IEEESPExponent_Mask
);
62 if (IEEESP_Pinfty
== yabs
)
64 SetSR(Overflow_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
68 z
= IEEESPFloor(IEEESPDiv(yabs
, pi
));
69 tmp
= IEEESPMul(z
,pi
);
70 tmp
|= IEEESPSign_Mask
; /* tmp = -tmp; */
71 yabs
= IEEESPAdd(yabs
, tmp
);
74 yabs
|= IEEESPSign_Mask
;
75 yabs
=IEEESPAdd(pi
, yabs
);
83 ysquared
= IEEESPMul(yabs
,yabs
);
84 Res
= IEEESPAdd(cosf1
,
93 IEEESPMul(ysquared
, cosf6
))))))))));
97 SetSR(Zero_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);
101 if (TRUE
== intern_IEEESPisodd(z
)) Res
^= IEEESPSign_Mask
;
102 if (TRUE
== tmp
) Res
^= IEEESPSign_Mask
;
104 if (Res
< 0) SetSR(Negative_Bit
, Zero_Bit
| Negative_Bit
| Overflow_Bit
);