提交 6ab8136b 编写于 作者: N nsz

add FORCE_EVAL macro to evaluate float expr for their side effect

updated nextafter* to use FORCE_EVAL, it can be used in many other
places in the math code to improve readability.
上级 4e597fee
...@@ -32,6 +32,19 @@ union dshape { ...@@ -32,6 +32,19 @@ union dshape {
uint64_t bits; uint64_t bits;
}; };
#define FORCE_EVAL(x) do { \
if (sizeof(x) == sizeof(float)) { \
volatile float __x; \
__x = (x); \
} else if (sizeof(x) == sizeof(double)) { \
volatile double __x; \
__x = (x); \
} else { \
volatile long double __x; \
__x = (x); \
} \
} while(0)
/* Get two 32 bit ints from a double. */ /* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(hi,lo,d) \ #define EXTRACT_WORDS(hi,lo,d) \
do { \ do { \
......
...@@ -29,9 +29,7 @@ double nextafter(double x, double y) ...@@ -29,9 +29,7 @@ double nextafter(double x, double y)
if (e == 0x7ff) if (e == 0x7ff)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (e == 0) { if (e == 0)
volatile double z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
...@@ -28,9 +28,7 @@ float nextafterf(float x, float y) ...@@ -28,9 +28,7 @@ float nextafterf(float x, float y)
if (e == 0x7f800000) if (e == 0x7f800000)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (e == 0) { if (e == 0)
volatile float z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
...@@ -38,10 +38,8 @@ long double nextafterl(long double x, long double y) ...@@ -38,10 +38,8 @@ long double nextafterl(long double x, long double y)
if (ux.bits.exp == 0x7fff) if (ux.bits.exp == 0x7fff)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (ux.bits.exp == 0) { if (ux.bits.exp == 0)
volatile float z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
...@@ -77,10 +75,8 @@ long double nextafterl(long double x, long double y) ...@@ -77,10 +75,8 @@ long double nextafterl(long double x, long double y)
if (ux.bits.exp == 0x7fff) if (ux.bits.exp == 0x7fff)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (ux.bits.exp == 0) { if (ux.bits.exp == 0)
volatile float z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
#endif #endif
...@@ -38,10 +38,8 @@ double nexttoward(double x, long double y) ...@@ -38,10 +38,8 @@ double nexttoward(double x, long double y)
if (e == 0x7ff) if (e == 0x7ff)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (e == 0) { if (e == 0)
volatile float z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
#endif #endif
...@@ -30,9 +30,7 @@ float nexttowardf(float x, long double y) ...@@ -30,9 +30,7 @@ float nexttowardf(float x, long double y)
if (e == 0x7f800000) if (e == 0x7f800000)
return x + x; return x + x;
/* raise underflow if ux.value is subnormal or zero */ /* raise underflow if ux.value is subnormal or zero */
if (e == 0) { if (e == 0)
volatile float z; FORCE_EVAL(x*x + ux.value*ux.value);
z = x*x + ux.value*ux.value;
}
return ux.value; return ux.value;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册