93 static partial class fdlibm
95 internal static double log1p(
double x)
98 ln2_hi = 6.93147180369123816490e-01,
99 ln2_lo = 1.90821492927058770002e-10,
100 two54 = 1.80143985094819840000e+16,
101 Lp1 = 6.666666666666735130e-01,
102 Lp2 = 3.999999999940941908e-01,
103 Lp3 = 2.857142874366239149e-01,
104 Lp4 = 2.222219843214978396e-01,
105 Lp5 = 1.818357216161805012e-01,
106 Lp6 = 1.531383769920937332e-01,
107 Lp7 = 1.479819860511658591e-01;
109 const double zero = 0.0;
111 double hfsq, f = 0, c = 0, s, z, R, u;
112 int k, hx, hu = 0, ax;
115 ax = hx & 0x7fffffff;
120 if (ax >= 0x3ff00000)
126 if (x == -1.0 && (hx == unchecked((
int)0xbff00000)))
127 return -two54 / zero;
129 return (x - x) / (x - x);
137 return x - x * x * 0.5;
139 if (hx > 0 || hx <= (unchecked((
int)0xbfd2bec3)))
141 k = 0; f = x; hu = 1;
144 if (hx >= 0x7ff00000)
return x + x;
151 k = (hu >> 20) - 1023;
152 c = (k > 0) ? 1.0 - (u - x) : x - (u - 1.0);
159 k = (hu >> 20) - 1023;
165 u = __HI(u, hu | 0x3ff00000);
170 u = __HI(u, hu | 0x3fe00000);
171 hu = (0x00100000 - hu) >> 2;
180 if (k == 0)
return zero;
181 else { c += k * ln2_lo;
return k * ln2_hi + c; }
183 R = hfsq * (1.0 - 0.66666666666666666 * f);
184 if (k == 0)
return f - R;
186 return k * ln2_hi - ((R - (k * ln2_lo + c)) - f);
190 R = z * (Lp1 + z * (Lp2 + z * (Lp3 + z * (Lp4 + z * (Lp5 + z * (Lp6 + z * Lp7))))));
191 if (k == 0)
return f - (hfsq - s * (hfsq + R));
193 return k * ln2_hi - ((hfsq - (s * (hfsq + R) + (k * ln2_lo + c))) - f);