diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-09-28 21:11:58 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-09-28 21:11:58 +0000 |
commit | b59ad2db99df74326ae28926299469eecce6f468 (patch) | |
tree | c18cd839284e4ce4ca1b9edc06a4f61032c077f4 /math/math.h | |
parent | e83be730910c341f2f02ccc207b0586bb04fc21a (diff) | |
download | glibc-b59ad2db99df74326ae28926299469eecce6f468.tar.gz |
Fix iszero for excess precision.
Floating-point classification macros are supposed to remove any excess
range or precision from their arguments. This patch fixes the
non-sNaN version of iszero to do so, by casting the argument to its
own type. (This will of course work only for standard-conforming
excess precision, not for what GCC does on 32-bit x86 by default where
the back end hides excess precision from the front end; the same
applies to most of the classification macros in that case, as showed
up when we made them use GCC built-in functions.)
(iseqsig will have the reverse issue, needing to ensure that when an
underlying function is used it's for a type wide enough not to remove
any excess precision, since comparison macros must not remove excess
precision.)
Tested for x86_64 and x86.
* math/math.h
[__GLIBC_USE (IEC_60559_BFP_EXT) && !__SUPPORT_SNAN__] (iszero):
Cast argument to its own type.
* math/test-iszero-excess-precision.c: New file.
* math/Makefile (tests): Add test-iszero-excess-precision.
(CFLAGS-test-iszero-excess-precision.c): New variable.
Diffstat (limited to 'math/math.h')
-rw-r--r-- | math/math.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/math/math.h b/math/math.h index 0a099596f1..1382baa75a 100644 --- a/math/math.h +++ b/math/math.h @@ -336,7 +336,7 @@ enum # ifdef __SUPPORT_SNAN__ # define iszero(x) (fpclassify (x) == FP_ZERO) # else -# define iszero(x) ((x) == 0) +# define iszero(x) (((__typeof (x)) (x)) == 0) # endif #endif /* Use IEC_60559_BFP_EXT. */ |