1 /* s_log1pf.c -- float version of s_log1p.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
9 * Developed at SunPro, a Sun Microsystems, Inc. business.
10 * Permission to use, copy, modify, and distribute this
11 * software is freely granted, provided that this notice
13 * ====================================================
17 static char rcsid
[] = "$FreeBSD: src/lib/msun/src/s_log1pf.c,v 1.12 2008/03/29 16:37:59 das Exp $";
21 #include "math_private.h"
24 ln2_hi
= 6.9313812256e-01, /* 0x3f317180 */
25 ln2_lo
= 9.0580006145e-06, /* 0x3717f7d1 */
26 two25
= 3.355443200e+07, /* 0x4c000000 */
27 Lp1
= 6.6666668653e-01, /* 3F2AAAAB */
28 Lp2
= 4.0000000596e-01, /* 3ECCCCCD */
29 Lp3
= 2.8571429849e-01, /* 3E924925 */
30 Lp4
= 2.2222198546e-01, /* 3E638E29 */
31 Lp5
= 1.8183572590e-01, /* 3E3A3325 */
32 Lp6
= 1.5313838422e-01, /* 3E1CD04F */
33 Lp7
= 1.4798198640e-01; /* 3E178897 */
35 static const float zero
= 0.0;
36 static const volatile float vzero
__attribute__ ((__section__(".rodata,\"a\" " SECTIONCOMMENT
))) = 0.0;
41 float hfsq
,f
,c
,s
,z
,R
,u
;
48 if (hx
< 0x3ed413d0) { /* 1+x < sqrt(2)+ */
49 if(ax
>=0x3f800000) { /* x <= -1.0 */
50 if(x
==(float)-1.0) return -two25
/vzero
; /* log1p(-1)=+inf */
51 else return (x
-x
)/(x
-x
); /* log1p(x<-1)=NaN */
53 if(ax
<0x38000000) { /* |x| < 2**-15 */
54 if(two25
+x
>zero
/* raise inexact */
55 &&ax
<0x33800000) /* |x| < 2**-24 */
58 return x
- x
*x
*(float)0.5;
60 if(hx
>0||hx
<=((int32_t)0xbe95f619)) {
61 k
=0;f
=x
;hu
=1;} /* sqrt(2)/2- <= 1+x < sqrt(2)+ */
63 if (hx
>= 0x7f800000) return x
+x
;
66 STRICT_ASSIGN(float,u
,(float)1.0+x
);
70 c
= (k
>0)? (float)1.0-(u
-x
):x
-(u
-(float)1.0);
80 * The approximation to sqrt(2) used in thresholds is not
81 * critical. However, the ones used above must give less
82 * strict bounds than the one here so that the k==0 case is
83 * never reached from here, since here we have committed to
84 * using the correction term but don't use it if k==0.
86 if(hu
<0x3504f4) { /* u < sqrt(2) */
87 SET_FLOAT_WORD(u
,hu
|0x3f800000);/* normalize u */
90 SET_FLOAT_WORD(u
,hu
|0x3f000000); /* normalize u/2 */
91 hu
= (0x00800000-hu
)>>2;
96 if(hu
==0) { /* |f| < 2**-20 */
105 R
= hfsq
*((float)1.0-(float)0.66666666666666666*f
);
106 if(k
==0) return f
-R
; else
107 return k
*ln2_hi
-((R
-(k
*ln2_lo
+c
))-f
);
109 s
= f
/((float)2.0+f
);
111 R
= z
*(Lp1
+z
*(Lp2
+z
*(Lp3
+z
*(Lp4
+z
*(Lp5
+z
*(Lp6
+z
*Lp7
))))));
112 if(k
==0) return f
-(hfsq
-s
*(hfsq
+R
)); else
113 return k
*ln2_hi
-((hfsq
-(s
*(hfsq
+R
)+(k
*ln2_lo
+c
)))-f
);