2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
9 * ====================================================
13 static char rcsid
[] = "$FreeBSD: src/lib/msun/src/e_acosl.c,v 1.2 2008/08/02 03:56:22 das Exp $";
17 * See comments in e_acos.c.
18 * Converted to long double by David Schultz <das@FreeBSD.ORG>.
25 #include "math_private.h"
27 static const long double
28 one
= 1.00000000000000000000e+00;
31 /* XXX Work around the fact that gcc truncates long double constants on i386 */
32 static const volatile double
33 pi1
__attribute__ ((__section__(".rodata,\"a\" " SECTIONCOMMENT
))) = 3.14159265358979311600e+00, /* 0x1.921fb54442d18p+1 */
34 pi2
__attribute__ ((__section__(".rodata,\"a\" " SECTIONCOMMENT
))) = 1.22514845490862001043e-16; /* 0x1.1a80000000000p-53 */
35 #define pi ((long double)pi1 + pi2)
37 static const long double
38 pi
= 3.14159265358979323846264338327950280e+00L;
45 long double z
,p
,q
,r
,w
,s
,c
,df
;
46 int16_t expsign
, expt
;
48 expsign
= u
.xbits
.expsign
;
49 expt
= expsign
& 0x7fff;
50 if(expt
>= BIAS
) { /* |x| >= 1 */
51 if(expt
==BIAS
&& ((u
.bits
.manh
&~LDBL_NBIT
)|u
.bits
.manl
)==0) {
52 if (expsign
>0) return 0.0; /* acos(1) = 0 */
53 else return pi
+2.0*pio2_lo
; /* acos(-1)= pi */
55 return (x
-x
)/(x
-x
); /* acos(|x|>1) is NaN */
57 if(expt
<BIAS
-1) { /* |x| < 0.5 */
58 if(expt
<ACOS_CONST
) return pio2_hi
+pio2_lo
;/*x tiny: acosl=pi/2*/
63 return pio2_hi
- (x
- (pio2_lo
-x
*r
));
64 } else if (expsign
<0) { /* x < -0.5 */
71 return pi
- 2.0*(s
+w
);
72 } else { /* x > 0.5 */