mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Make iseqsig handle excess precision.
iseqsig, like other type-generic comparison macros, should behave like a comparison operator in not removing excess range and precision from its arguments (see C11 F.10.11). This patch implements this by making definitions of iseqsig appropriately conditional on __FLT_EVAL_METHOD__ (including support for TS 18661-3 values of that macro), with a corresponding testcase (that failed for 32-bit x86 in the absence of the math.h changes) being added. (Of course the definitions may need reworking when float128 support is added, just as with other type-generic macros.) Tested for x86_64 and x86. * math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (iseqsig): Define conditional on value of [__FLT_EVAL_METHOD__]. * math/test-iseqsig-excess-precision.c: New file. * math/Makefile (tests): Add test-iseqsig-excess-precision.
This commit is contained in:
19
math/math.h
19
math/math.h
@ -535,17 +535,32 @@ extern int matherr (struct exception *__exc);
|
||||
/* Return X == Y but raising "invalid" and setting errno if X or Y is
|
||||
a NaN. */
|
||||
# ifdef __NO_LONG_DOUBLE_MATH
|
||||
# define iseqsig(x, y) \
|
||||
# if (__FLT_EVAL_METHOD__ == 1 \
|
||||
|| __FLT_EVAL_METHOD__ == 2 \
|
||||
|| __FLT_EVAL_METHOD__ > 32)
|
||||
# define iseqsig(x, y) __iseqsig ((x), (y))
|
||||
# else
|
||||
# define iseqsig(x, y) \
|
||||
(sizeof ((x) + (y)) == sizeof (float) \
|
||||
? __iseqsigf ((x), (y)) \
|
||||
: __iseqsig ((x), (y)))
|
||||
# endif
|
||||
# else
|
||||
# define iseqsig(x, y) \
|
||||
# if __FLT_EVAL_METHOD__ == 2 || __FLT_EVAL_METHOD__ > 64
|
||||
# define iseqsig(x, y) __iseqsigl ((x), (y))
|
||||
# elif __FLT_EVAL_METHOD__ == 1 || __FLT_EVAL_METHOD__ > 32
|
||||
# define iseqsig(x, y) \
|
||||
(sizeof ((x) + (y)) <= sizeof (double) \
|
||||
? __iseqsig ((x), (y)) \
|
||||
: __iseqsigl ((x), (y)))
|
||||
# else
|
||||
# define iseqsig(x, y) \
|
||||
(sizeof ((x) + (y)) == sizeof (float) \
|
||||
? __iseqsigf ((x), (y)) \
|
||||
: sizeof ((x) + (y)) == sizeof (double) \
|
||||
? __iseqsig ((x), (y)) \
|
||||
: __iseqsigl ((x), (y)))
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user