summaryrefslogtreecommitdiff
path: root/lib/libm
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2017-10-23 12:29:17 -0400
committerScott Shawcroft <scott@tannewt.org>2017-10-23 15:26:36 -0700
commit6df99b5d0e0f406b6b3e8bd220d1129225b9c2ae (patch)
treeb600ea4365649649ca371df427b87ded3f619441 /lib/libm
parent1c97b7f4df63e5fcac655b2749e861eeba4ef79f (diff)
Merge 2.1.0 changes into master.
Diffstat (limited to 'lib/libm')
-rw-r--r--lib/libm/ef_rem_pio2.c5
-rw-r--r--lib/libm/kf_rem_pio2.c6
-rw-r--r--lib/libm/math.c8
-rw-r--r--lib/libm/nearbyintf.c3
-rw-r--r--lib/libm/sf_ldexp.c3
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;