diff options
| author | Dan Halbert <halbert@halwitz.org> | 2017-10-23 12:29:17 -0400 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2017-10-23 15:26:36 -0700 |
| commit | 6df99b5d0e0f406b6b3e8bd220d1129225b9c2ae (patch) | |
| tree | b600ea4365649649ca371df427b87ded3f619441 /lib/libm | |
| parent | 1c97b7f4df63e5fcac655b2749e861eeba4ef79f (diff) | |
Merge 2.1.0 changes into master.
Diffstat (limited to 'lib/libm')
| -rw-r--r-- | lib/libm/ef_rem_pio2.c | 5 | ||||
| -rw-r--r-- | lib/libm/kf_rem_pio2.c | 6 | ||||
| -rw-r--r-- | lib/libm/math.c | 8 | ||||
| -rw-r--r-- | lib/libm/nearbyintf.c | 3 | ||||
| -rw-r--r-- | lib/libm/sf_ldexp.c | 3 |
5 files changed, 20 insertions, 5 deletions
diff --git a/lib/libm/ef_rem_pio2.c b/lib/libm/ef_rem_pio2.c index ca55243fb..601f3bac4 100644 --- a/lib/libm/ef_rem_pio2.c +++ b/lib/libm/ef_rem_pio2.c @@ -151,7 +151,7 @@ pio2_3t = 6.1232342629e-17; /* 0x248d3132 */ fn = (float)n; r = t-fn*pio2_1; w = fn*pio2_1t; /* 1st round good to 40 bit */ - if(n<32&&(ix&0xffffff00)!=npio2_hw[n-1]) { + if(n<32&&(__int32_t)(ix&0xffffff00)!=npio2_hw[n-1]) { y[0] = r-w; /* quick check no cancellation */ } else { __uint32_t high; @@ -195,7 +195,10 @@ pio2_3t = 6.1232342629e-17; /* 0x248d3132 */ } tx[2] = z; nx = 3; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" while(tx[nx-1]==zero) nx--; /* skip zero term */ +#pragma GCC diagnostic pop n = __kernel_rem_pio2f(tx,y,e0,nx,2,two_over_pi); if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} return n; diff --git a/lib/libm/kf_rem_pio2.c b/lib/libm/kf_rem_pio2.c index c7e947957..3b09de5fd 100644 --- a/lib/libm/kf_rem_pio2.c +++ b/lib/libm/kf_rem_pio2.c @@ -138,7 +138,10 @@ recompute: } /* check if recomputation is needed */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" if(z==zero) { +#pragma GCC diagnostic pop j = 0; for (i=jz-1;i>=jk;i--) j |= iq[i]; if(j==0) { /* need recomputation */ @@ -155,7 +158,10 @@ recompute: } /* chop off zero terms */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" if(z==(float)0.0) { +#pragma GCC diagnostic pop jz -= 1; q0 -= 8; while(iq[jz]==0) { jz--; q0-=8;} } else { /* break z into 8-bit if necessary */ diff --git a/lib/libm/math.c b/lib/libm/math.c index 984636627..a2313fcea 100644 --- a/lib/libm/math.c +++ b/lib/libm/math.c @@ -338,7 +338,7 @@ float powf(float x, float y) return sn*huge*huge; /* overflow */ } else if ((j&0x7fffffff) > 0x43160000) /* z < -150 */ // FIXME: check should be (uint32_t)j > 0xc3160000 return sn*tiny*tiny; /* underflow */ - else if (j == 0xc3160000) { /* z == -150 */ + else if (j == (int32_t) 0xc3160000) { /* z == -150 */ if (p_l <= z-p_h) return sn*tiny*tiny; /* underflow */ } @@ -585,13 +585,13 @@ float expm1f(float x) /*****************************************************************************/ /*****************************************************************************/ -/* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */ -static const int k = 235; -static const float kln2 = 0x1.45c778p+7f; /* expf(x)/2 for x >= log(FLT_MAX), slightly better than 0.5f*expf(x/2)*expf(x/2) */ float __expo2f(float x) { + /* k is such that k*ln2 has minimal relative error and x - kln2 > log(FLT_MIN) */ + static const int k = 235; + static const float kln2 = 0x1.45c778p+7f; float scale; /* note that k is odd and scale*scale overflows */ diff --git a/lib/libm/nearbyintf.c b/lib/libm/nearbyintf.c index 1c3545945..1bb44aa46 100644 --- a/lib/libm/nearbyintf.c +++ b/lib/libm/nearbyintf.c @@ -15,7 +15,10 @@ float nearbyintf(float x) y = x - 0x1p23f + 0x1p23f; else y = x + 0x1p23f - 0x1p23f; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" if (y == 0) +#pragma GCC diagnostic pop return s ? -0.0f : 0.0f; return y; } diff --git a/lib/libm/sf_ldexp.c b/lib/libm/sf_ldexp.c index 37968d475..75cb8b727 100644 --- a/lib/libm/sf_ldexp.c +++ b/lib/libm/sf_ldexp.c @@ -32,7 +32,10 @@ float value; int exp; #endif { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" if(!isfinite(value)||value==(float)0.0) return value; +#pragma GCC diagnostic pop value = scalbnf(value,exp); //if(!finitef(value)||value==(float)0.0) errno = ERANGE; return value; |
