Define TS 18661-1 CR_DECIMAL_DIG in <float.h>.
authorJoseph Myers <joseph@codesourcery.com>
Mon, 19 Sep 2016 21:53:30 +0000 (22:53 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 19 Sep 2016 21:53:30 +0000 (22:53 +0100)
TS 18661-1 defines a macro CR_DECIMAL_DIG in <float.h>, for the number
of decimal digits for which conversions between decimal character
strings and (IEEE) binary formats, in both directions, are correctly
rounded.  This patch implements support for this macro in GCC's
<float.h>.

The definition __UINTMAX_MAX__ is the right one for GCC's conversions
of floating constants, since I made those use MPFR to make them
correctly rounding.  The macro also covers standard library functions
such as strtod and printf.  The definition is also correct for current
glibc.  If any targets' libcs support correct rounding in a way that
conforms to TS 18661-1 with a smaller value of CR_DECIMAL_DIG, making
<float.h> reflect that could not be done in isolation without changes
to the interpretation of floating constants as well, since a smaller
CR_DECIMAL_DIG requires double rounding of floating constants (first
to CR_DECIMAL_DIG decimal digits, then to the desired binary format).

Boostrapped with no regressions on x86_64-pc-linux-gnu.

gcc:
* ginclude/float.h [__STDC_WANT_IEC_60559_BFP_EXT__]
(CR_DECIMAL_DIG): New macro.

gcc/testsuite:
* gcc.dg/cr-decimal-dig-1.c: New test.

From-SVN: r240249

gcc/ChangeLog
gcc/ginclude/float.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cr-decimal-dig-1.c [new file with mode: 0644]

index e3ec20e9020da9d1b5c01d34d5937e52a9388c4d..3b5fc9cb59b7d8bfda4ea972f1c757e4e388114c 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-19  Joseph Myers  <joseph@codesourcery.com>
+
+       * ginclude/float.h [__STDC_WANT_IEC_60559_BFP_EXT__]
+       (CR_DECIMAL_DIG): New macro.
+
 2016-09-19  Joseph Myers  <joseph@codesourcery.com>
 
        * ginclude/stddef.h (max_align_t) [__i386__]: Add __float128
index de46a2711a96e7c31f5fcb16441cc1e6da2d86f4..421f7351e37477760fcbcd506061739a1ce1cadd 100644 (file)
@@ -185,6 +185,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #endif /* C11 */
 
+#ifdef __STDC_WANT_IEC_60559_BFP_EXT__
+/* Number of decimal digits for which conversions between decimal
+   character strings and binary formats, in both directions, are
+   correctly rounded.  */
+#define CR_DECIMAL_DIG __UINTMAX_MAX__
+#endif
+
 #ifdef __STDC_WANT_IEC_60559_TYPES_EXT__
 /* Constants for _FloatN and _FloatNx types from TS 18661-3.  See
    comments above for their semantics.  */
index 741ec97005437abea9087ce72f16bc123f0cfcd0..c825702acbab3545f6d796dd46713ca89cb2c7c0 100644 (file)
@@ -1,3 +1,7 @@
+2016-09-19  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/cr-decimal-dig-1.c: New test.
+
 2016-09-19  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/float128-align.c, gcc.dg/float128x-align.c,
diff --git a/gcc/testsuite/gcc.dg/cr-decimal-dig-1.c b/gcc/testsuite/gcc.dg/cr-decimal-dig-1.c
new file mode 100644 (file)
index 0000000..2bbc40c
--- /dev/null
@@ -0,0 +1,14 @@
+/* Test TS 18661-1 CR_DECIMAL_DIG.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11" } */
+
+#define __STDC_WANT_IEC_60559_BFP_EXT__
+#include <float.h>
+
+#ifndef CR_DECIMAL_DIG
+#error "CR_DECIMAL_DIG not defined"
+#endif
+
+#if CR_DECIMAL_DIG < DECIMAL_DIG + 3
+#error "CR_DECIMAL_DIG too small"
+#endif