2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9 * Developed at SunSoft, a Sun Microsystems, Inc. business.
10 * Permission to use, copy, modify, and distribute this
11 * software is freely granted, provided that this notice
13 * ====================================================
16 #include "mathieeesingtrans_intern.h"
18 /*****************************************************************************
22 AROS_LH1(float, IEEESPAcos
,
25 AROS_LHA(float, y
, D0
),
28 struct Library
*, MathIeeeSingTransBase
, 20, MathIeeeSingTrans
)
31 Calculate arcuscos of the given number
36 IEEE single precision floating point number
40 negative : 0 (not possible)
41 overflow : y < -1 or y > 1
47 *****************************************************************************/
52 LONG z
,p
,q
,r
,w
,s
,c
,ix
,df
;
53 ix
= y
& (IEEESPMantisse_Mask
| IEEESPExponent_Mask
); /* ix = |y| */
55 z
= IEEESPCmp(ix
,one
);
57 if (1==z
) /* |y| > 1 */
59 SetSR(Overflow_Bit
, Zero_Bit
| Overflow_Bit
| Negative_Bit
);
63 if (0==z
) /* |y| = 1 */
65 if (y
& IEEESPSign_Mask
) /* y = -1 */ return pi
;
66 SetSR(Zero_Bit
, Zero_Bit
| Overflow_Bit
| Negative_Bit
);
70 /* error: 1 ulp (unit in the last place) */
71 if (-1 == IEEESPCmp(ix
,onehalf
)) /* |fnum1| < 0.5 */
74 p
= IEEESPMul(z
, IEEESPAdd(pS0
,
75 IEEESPMul(z
, IEEESPAdd(pS1
,
76 IEEESPMul(z
, IEEESPAdd(pS2
,
77 IEEESPMul(z
, IEEESPAdd(pS3
,
78 IEEESPMul(z
, IEEESPAdd(pS4
,
79 IEEESPMul(z
, pS5
)))))))))));
81 IEEESPMul(z
, IEEESPAdd(qS1
,
82 IEEESPMul(z
, IEEESPAdd(qS2
,
83 IEEESPMul(z
, IEEESPAdd(qS3
,
84 IEEESPMul(z
, qS4
))))))));
87 return (IEEESPSub(pio2
,IEEESPAdd(y
,IEEESPMul(y
,r
))));
91 if (y
& IEEESPSign_Mask
) /* y < -0.5 */
93 z
= IEEESPMul(onehalf
, IEEESPAdd(one
, y
));
94 p
= IEEESPMul(z
, IEEESPAdd(pS0
,
95 IEEESPMul(z
, IEEESPAdd(pS1
,
96 IEEESPMul(z
, IEEESPAdd(pS2
,
97 IEEESPMul(z
, IEEESPAdd(pS3
,
98 IEEESPMul(z
, IEEESPAdd(pS4
,
99 IEEESPMul(z
, pS5
)))))))))));
101 IEEESPMul(z
, IEEESPAdd(qS1
,
102 IEEESPMul(z
, IEEESPAdd(qS2
,
103 IEEESPMul(z
, IEEESPAdd(qS3
,
104 IEEESPMul(z
, qS4
))))))));
106 r
= IEEESPDiv(p
,q
); /* r = p/q; */
109 return IEEESPSub(pi
, IEEESPMul(two
, IEEESPAdd(s
, w
)));
114 z
= IEEESPMul(onehalf
, IEEESPSub(one
, y
));
117 //df = df & 0xfff000ff;
118 c
= IEEESPDiv(IEEESPSub(z
, IEEESPMul(df
,df
)), IEEESPAdd(df
,s
) );
119 p
= IEEESPMul(z
, IEEESPAdd(pS0
,
120 IEEESPMul(z
, IEEESPAdd(pS1
,
121 IEEESPMul(z
, IEEESPAdd(pS2
,
122 IEEESPMul(z
, IEEESPAdd(pS3
,
123 IEEESPMul(z
, IEEESPAdd(pS4
,
124 IEEESPMul(z
, pS5
)))))))))));
126 IEEESPMul(z
, IEEESPAdd(qS1
,
127 IEEESPMul(z
, IEEESPAdd(qS2
,
128 IEEESPMul(z
, IEEESPAdd(qS3
,
129 IEEESPMul(z
, qS4
))))))));
131 w
= IEEESPAdd(c
, IEEESPMul(r
,s
));
133 return IEEESPMul(two
, IEEESPAdd(df
,w
));