diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-12-16 18:03:25 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-12-16 18:03:25 +0000 |
commit | c0b4353654e635e280ec0c1972f251bf696abb36 (patch) | |
tree | 0c695b7feecc0397628c89e0f5b02690ef2cc857 /manual/arith.texi | |
parent | 8b1f57f4f2c9c71c51b31fda1c91ca0e36b1fb18 (diff) | |
download | glibc-c0b4353654e635e280ec0c1972f251bf696abb36.zip glibc-c0b4353654e635e280ec0c1972f251bf696abb36.tar.gz glibc-c0b4353654e635e280ec0c1972f251bf696abb36.tar.bz2 |
Define FE_SNANS_ALWAYS_SIGNAL.
TS 18661-1 defines a macro FE_SNANS_ALWAYS_SIGNAL in <fenv.h>, to
indicate that the recommended practice regarding sNaNs (that
operations always produce a qNaN output with "invalid" exception, even
in the fmax / fmin / hypot / pow cases where a qNaN input would not
result in qNaN output) is followed.
Now that those functions with C99 special cases for NaNs have been
fixed not to apply those special cases to sNaN, only to qNaN, glibc
follows that recommended practice. This patch makes it define the
corresponding macro.
Since compiler optimizations may affect whether sNaNs behave as
expected and the macro relates to both language and library features,
it is only defined if __SUPPORT_SNAN__ is defined (which GCC defines
for -fsignaling-nans). It is also not defined if FE_INVALID is
undefined, since the recommended practice specifically refers to
raising the "invalid" exception, so it seems inappropriate to define
the macro for soft-float cases without support for exceptions.
(Further refinement would be possible in cases where bits/fenv.h is
shared by configurations both with and without exceptions support.)
Tested for x86_64 and x86, and also did compile-only testing for nios2
to cover the no-exceptions case.
* math/fenv.h
[__GLIBC_USE (IEC_60559_BFP_EXT) && FE_INVALID && __SUPPORT_SNAN__]
(FE_SNANS_ALWAYS_SIGNAL): New macro.
* math/test-fe-snans-always-signal.c: New file.
* math/Makefile (tests): Add test-fe-snans-always-signal.
(CFLAGS-test-fe-snans-always-signal.c): New variable.
* manual/arith.texi (Infinity and NaN): Document
FE_SNANS_ALWAYS_SIGNAL.
Diffstat (limited to 'manual/arith.texi')
-rw-r--r-- | manual/arith.texi | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/manual/arith.texi b/manual/arith.texi index f9296a3..41ab577 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -720,6 +720,20 @@ These macros, defined by TS 18661-1:2014, are constant expressions for signaling NaNs. @end deftypevr +@comment fenv.h +@comment ISO +@deftypevr Macro int FE_SNANS_ALWAYS_SIGNAL +This macro, defined by TS 18661-1:2014, is defined to @code{1} in +@file{fenv.h} to indicate that functions and operations with signaling +NaN inputs and floating-point results always raise the invalid +exception and return a quiet NaN, even in cases (such as @code{fmax}, +@code{hypot} and @code{pow}) where a quiet NaN input can produce a +non-NaN result. Because some compiler optimizations may not handle +signaling NaNs correctly, this macro is only defined if compiler +support for signaling NaNs is enabled. That support can be enabled +with the GCC option @option{-fsignaling-nans}. +@end deftypevr + @w{IEEE 754} also allows for another unusual value: negative zero. This value is produced when you divide a positive number by negative infinity, or when a negative result is smaller than the limits of |