]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use type-specific precision when printing results in libm-test.inc.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 1 Oct 2015 15:24:54 +0000 (15:24 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 1 Oct 2015 15:24:54 +0000 (15:24 +0000)
When libm-test.inc prints the results of failing tests, the output can
be unhelpful for ldbl-128 and ldbl-128ibm because the precision used
is insufficient to distinguish values of those types, resulting in
reported values that look identical but differ by a large number of
ulps.

This patch changes it to use a precision appropriate for the type, for
both decimal and hex output (so output for float is more compact,
output for ldbl-128 and ldbl-128ibm is substantially wider).  The
natural precision to use for decimal is given by the C11 <float.h>
macros such as FLT_DECIMAL_DIG.  GCC's <float.h> only defines those in
C11 mode, so this patch uses the predefines such as
__FLT_DECIMAL_DIG__ (added in GCC 4.6) instead; if we move to building
with -std=gnu11 (or -std=gnu1x if we can't get rid of 4.6 support).

Tested for powerpc and mips64.

* math/libm-test.inc (TYPE_DECIMAL_DIG): New macro.
(TYPE_HEX_DIG): Likewise.
(print_float): Use TYPE_DECIMAL_DIG - 1 and TYPE_HEX_DIG - 1 as
precisions when printing floating-point numbers.
(check_float_internal): Likewise.

ChangeLog
math/libm-test.inc

index a88defa9f6631acbe665a4ebda897cca3380ecc2..6da0652f4e6c6fa63f7a8c4241f328571eb7c3bd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-10-01  Joseph Myers  <joseph@codesourcery.com>
+
+       * math/libm-test.inc (TYPE_DECIMAL_DIG): New macro.
+       (TYPE_HEX_DIG): Likewise.
+       (print_float): Use TYPE_DECIMAL_DIG - 1 and TYPE_HEX_DIG - 1 as
+       precisions when printing floating-point numbers.
+       (check_float_internal): Likewise.
+
 2015-09-30  Joseph Myers  <joseph@codesourcery.com>
 
        [BZ #16620]
index 86159576003b56d0482accb82b2cf999b1be1ca7..f627296d66153016d812519f9adc6cce437d85ed 100644 (file)
@@ -338,6 +338,18 @@ static FLOAT max_valid_error;
                         (LDBL_MANT_DIG-1), (DBL_MANT_DIG-1), (FLT_MANT_DIG-1))
 #define MIN_EXP CHOOSE ((LDBL_MIN_EXP-1), (DBL_MIN_EXP-1), (FLT_MIN_EXP-1),    \
                        (LDBL_MIN_EXP-1), (DBL_MIN_EXP-1), (FLT_MIN_EXP-1))
+/* Sufficient numbers of digits to represent any floating-point value
+   unambiguously (for any choice of the number of bits in the first
+   hex digit, in the case of TYPE_HEX_DIG).  When used with printf
+   formats where the precision counts only digits after the point, 1
+   is subtracted from these values. */
+#define TYPE_DECIMAL_DIG CHOOSE (__DECIMAL_DIG__,      \
+                                __DBL_DECIMAL_DIG__,   \
+                                __FLT_DECIMAL_DIG__,   \
+                                __DECIMAL_DIG__,       \
+                                __DBL_DECIMAL_DIG__,   \
+                                __FLT_DECIMAL_DIG__)
+#define TYPE_HEX_DIG ((MANT_DIG + 7) / 4)
 
 /* Compare KEY (a string, with the name of a function) with ULP (a
    pointer to a struct ulp_data structure), returning a value less
@@ -419,7 +431,8 @@ print_float (FLOAT f)
   else if (isnan (f))
     printf ("qNaN\n");
   else
-    printf ("% .20" PRINTF_EXPR "  % .20" PRINTF_XEXPR "\n", f, f);
+    printf ("% .*" PRINTF_EXPR "  % .*" PRINTF_XEXPR "\n",
+           TYPE_DECIMAL_DIG - 1, f, TYPE_HEX_DIG - 1, f);
 }
 
 /* Should the message print to screen?  This depends on the verbose flag,
@@ -837,8 +850,8 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
       print_float (expected);
       if (print_diff)
        {
-         printf (" difference: % .20" PRINTF_EXPR "  % .20" PRINTF_XEXPR
-                 "\n", diff, diff);
+         printf (" difference: % .*" PRINTF_EXPR "  % .*" PRINTF_XEXPR
+                 "\n", TYPE_DECIMAL_DIG - 1, diff, TYPE_HEX_DIG - 1, diff);
          printf (" ulp       : % .4" PRINTF_NEXPR "\n", ulps);
          printf (" max.ulp   : % .4" PRINTF_NEXPR "\n", max_ulp);
        }