This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.24-196-gb59ad2d


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  b59ad2db99df74326ae28926299469eecce6f468 (commit)
      from  e83be730910c341f2f02ccc207b0586bb04fc21a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=b59ad2db99df74326ae28926299469eecce6f468

commit b59ad2db99df74326ae28926299469eecce6f468
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Wed Sep 28 21:11:58 2016 +0000

    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.

diff --git a/ChangeLog b/ChangeLog
index 6d6e668..1f9538c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2016-09-28  Joseph Myers  <joseph@codesourcery.com>
+
+	* 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.
+
 2016-09-28  Rasmus Villemoes <rv@rasmusvillemoes.dk>
 
 	* sysdeps/unix/sysv/linux/spawni.c (posix_spawn_args): Remove pipe
diff --git a/math/Makefile b/math/Makefile
index 6c58b97..7ccd59a 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -156,7 +156,7 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-signgam-ullong-init test-nan-overflow test-nan-payload \
 	test-fexcept test-fexcept-traps test-fesetexcept \
 	test-fesetexcept-traps test-fetestexceptflag test-femode \
-	test-femode-traps $(tests-static)
+	test-femode-traps test-iszero-excess-precision $(tests-static)
 tests-static = test-fpucw-static test-fpucw-ieee-static \
 	       test-signgam-uchar-static test-signgam-uchar-init-static \
 	       test-signgam-uint-static test-signgam-uint-init-static \
@@ -266,6 +266,8 @@ CFLAGS-test-signgam-ullong-init-static.c = -std=c99
 
 CFLAGS-test-math-isinff.cc = -std=gnu++11
 
+CFLAGS-test-iszero-excess-precision.c = -fexcess-precision=standard
+
 # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
 # for error handling in the -lm functions.
 install-lib += libieee.a
diff --git a/math/math.h b/math/math.h
index 0a09959..1382baa 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.  */
 
diff --git a/math/test-iszero-excess-precision.c b/math/test-iszero-excess-precision.c
new file mode 100644
index 0000000..52abc5a
--- /dev/null
+++ b/math/test-iszero-excess-precision.c
@@ -0,0 +1,49 @@
+/* Test iszero with excess precision.
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <float.h>
+#include <math.h>
+#include <stdio.h>
+
+#define TEST(TYPE, TRUE_MIN)						\
+  do									\
+    {									\
+      if (iszero (TRUE_MIN / 2))					\
+	puts ("iszero removes excess precision for " #TYPE);		\
+      else								\
+	{								\
+	  puts ("iszero fails to remove excess precision for " #TYPE);	\
+	  result = 1;							\
+	}								\
+    }									\
+  while (0)
+
+static int
+do_test (void)
+{
+  int result = 0;
+
+  TEST (float, FLT_TRUE_MIN);
+  TEST (double, DBL_TRUE_MIN);
+  TEST (long double, LDBL_TRUE_MIN);
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |    9 ++++
 math/Makefile                                      |    4 +-
 math/math.h                                        |    2 +-
 ...{test-powl.c => test-iszero-excess-precision.c} |   44 +++++++++-----------
 4 files changed, 33 insertions(+), 26 deletions(-)
 copy math/{test-powl.c => test-iszero-excess-precision.c} (64%)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]