catrig[fl].c and inexact
Steve Kargl
sgk at troutmask.apl.washington.edu
Fri May 12 21:56:58 UTC 2017
So, I've been making improvements to my implementations of
the half-cycle trig functions. In doing so, I decide to
add WARNS=2 to msun/Makefile. clang 4.0.0 dies with an
error about an unused variable in raise_inexact() from
catrig[fl].c.
/usr/home/kargl/trunk/math/libm/msun/src/catrigl.c:195:2: error: unused variable
'junk' [-Werror,-Wunused-variable]
raise_inexact();
^
/usr/home/kargl/trunk/math/libm/msun/src/catrigl.c:56:45: note: expanded from
macro 'raise_inexact'
#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0)
^
Grepping catrig.o for the variable 'junk' suggests that 'junk' is
optimized out (with at least -O2).
A quick and dirty patch to achieve the intent of the original
code follows. It would be nice if some would like to commit
the patch. Of course, you may want to wait for Bruce to
review the diff.
Index: src/catrig.c
===================================================================
--- src/catrig.c (revision 1935)
+++ src/catrig.c (working copy)
@@ -37,7 +37,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrig.c 313863
#define isinf(x) (fabs(x) == INFINITY)
#undef isnan
#define isnan(x) ((x) != (x))
-#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0)
+#define raise_inexact(x) do { (x) = 1 + tiny; } while(0)
#undef signbit
#define signbit(x) (__builtin_signbit(x))
@@ -315,7 +315,7 @@ casinh(double complex z)
return (z);
/* All remaining cases are inexact. */
- raise_inexact();
+ raise_inexact(new_y);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (z);
@@ -400,7 +400,7 @@ cacos(double complex z)
return (CMPLX(0, -y));
/* All remaining cases are inexact. */
- raise_inexact();
+ raise_inexact(new_x);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (CMPLX(pio2_hi - (x - pio2_lo), -y));
@@ -607,7 +607,7 @@ catanh(double complex z)
* inexact, but this is the only only that needs to do it
* explicitly.
*/
- raise_inexact();
+ raise_inexact(ax);
return (z);
}
Index: src/catrigf.c
===================================================================
--- src/catrigf.c (revision 1935)
+++ src/catrigf.c (working copy)
@@ -51,7 +51,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrigf.c 275819
#define isinf(x) (fabsf(x) == INFINITY)
#undef isnan
#define isnan(x) ((x) != (x))
-#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0)
+#define raise_inexact(x) do { (x) = 1 + tiny; } while(0)
#undef signbit
#define signbit(x) (__builtin_signbitf(x))
@@ -176,7 +176,7 @@ casinhf(float complex z)
if (x == 0 && y == 0)
return (z);
- raise_inexact();
+ raise_inexact(new_y);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (z);
@@ -234,7 +234,7 @@ cacosf(float complex z)
if (x == 1 && y == 0)
return (CMPLXF(0, -y));
- raise_inexact();
+ raise_inexact(new_x);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (CMPLXF(pio2_hi - (x - pio2_lo), -y));
@@ -365,7 +365,7 @@ catanhf(float complex z)
copysignf(pio2_hi + pio2_lo, y)));
if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
- raise_inexact();
+ raise_inexact(ax);
return (z);
}
Index: src/catrigl.c
===================================================================
--- src/catrigl.c (revision 1935)
+++ src/catrigl.c (working copy)
@@ -53,7 +53,7 @@ __FBSDID("$FreeBSD: head/lib/msun/src/catrigl.c 313761
#define isinf(x) (fabsl(x) == INFINITY)
#undef isnan
#define isnan(x) ((x) != (x))
-#define raise_inexact() do { volatile float junk = 1 + tiny; } while(0)
+#define raise_inexact(x) do { (x) = 1 + tiny; } while(0)
#undef signbit
#define signbit(x) (__builtin_signbitl(x))
@@ -192,7 +192,7 @@ casinhl(long double complex z)
if (x == 0 && y == 0)
return (z);
- raise_inexact();
+ raise_inexact(new_y);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (z);
@@ -251,7 +251,7 @@ cacosl(long double complex z)
if (x == 1 && y == 0)
return (CMPLXL(0, -y));
- raise_inexact();
+ raise_inexact(new_x);
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
return (CMPLXL(pio2_hi - (x - pio2_lo), -y));
@@ -383,7 +383,7 @@ catanhl(long double complex z)
copysignl(pio2_hi + pio2_lo, y)));
if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
- raise_inexact();
+ raise_inexact(ax);
return (z);
}
--
Steve
20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4
20161221 https://www.youtube.com/watch?v=IbCHE-hONow
More information about the freebsd-numerics
mailing list