|
@@ -44,6 +44,7 @@ pio2_1 = 1.57079632679597125389e+00,
|
|
|
pio2_2 = -1.07463465549783099519e-12,
|
|
|
pio2_3 = 6.36831716351370313614e-25;
|
|
|
static const long double
|
|
|
+pio4 = 0x1.921fb54442d1846ap-1L,
|
|
|
invpio2 = 6.36619772367581343076e-01L,
|
|
|
pio2_1t = -1.07463465549719416346e-12L,
|
|
|
pio2_2t = 6.36831716351095013979e-25L,
|
|
@@ -57,6 +58,7 @@ pio2_3t = -2.75299651904407171810e-37L;
|
|
|
#define NX 5
|
|
|
#define NY 3
|
|
|
static const long double
|
|
|
+pio4 = 0x1.921fb54442d18469898cc51701b8p-1L,
|
|
|
invpio2 = 6.3661977236758134307553505349005747e-01L,
|
|
|
pio2_1 = 1.5707963267948966192292994253909555e+00L,
|
|
|
pio2_1t = 2.0222662487959507323996846200947577e-21L,
|
|
@@ -76,11 +78,23 @@ int __rem_pio2l(long double x, long double *y)
|
|
|
u.f = x;
|
|
|
ex = u.i.se & 0x7fff;
|
|
|
if (SMALL(u)) {
|
|
|
-
|
|
|
+
|
|
|
fn = x*invpio2 + toint - toint;
|
|
|
n = QUOBITS(fn);
|
|
|
r = x-fn*pio2_1;
|
|
|
w = fn*pio2_1t;
|
|
|
+
|
|
|
+ if (predict_false(r - w < -pio4)) {
|
|
|
+ n--;
|
|
|
+ fn--;
|
|
|
+ r = x - fn*pio2_1;
|
|
|
+ w = fn*pio2_1t;
|
|
|
+ } else if (predict_false(r - w > pio4)) {
|
|
|
+ n++;
|
|
|
+ fn++;
|
|
|
+ r = x - fn*pio2_1;
|
|
|
+ w = fn*pio2_1t;
|
|
|
+ }
|
|
|
y[0] = r-w;
|
|
|
u.f = y[0];
|
|
|
ey = u.i.se & 0x7fff;
|