changeset 37222:e7fa9ea5d6b6

isnan: port to VAX Reported by John Klos for NetBSD-5/VAX in <http://lists.gnu.org/archive/html/bug-gnulib/2013-10/msg00133.html>. * lib/isnan.c (IEEE_FLOATING_POINT): New macro, stolen from Emacs. (FUNC): Use it.
author Paul Eggert <eggert@cs.ucla.edu>
date Wed, 30 Oct 2013 20:51:39 -0700
parents 336fcfecc05e
children b821a5c78c89
files ChangeLog lib/isnan.c
diffstat 2 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Oct 28 16:08:16 2013 -0700
+++ b/ChangeLog	Wed Oct 30 20:51:39 2013 -0700
@@ -1,3 +1,11 @@
+2013-10-30  Paul Eggert  <eggert@cs.ucla.edu>
+
+	isnan: port to VAX
+	Reported by John Klos for NetBSD-5/VAX in
+	<http://lists.gnu.org/archive/html/bug-gnulib/2013-10/msg00133.html>.
+	* lib/isnan.c (IEEE_FLOATING_POINT): New macro, stolen from Emacs.
+	(FUNC): Use it.
+
 2013-10-28  Jim Meyering  <meyering@fb.com>
 
 	gnulib-tool: protect against CDPATH
--- a/lib/isnan.c	Mon Oct 28 16:08:16 2013 -0700
+++ b/lib/isnan.c	Wed Oct 30 20:51:39 2013 -0700
@@ -79,10 +79,21 @@
   ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
 
+/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
+   representations, have infinities and NaNs, and do not trap on
+   exceptions.  Define IEEE_FLOATING_POINT if this host is one of the
+   typical ones.  The C11 macro __STDC_IEC_559__ is close to what is
+   wanted here, but is not quite right because this file does not require
+   all the features of C11 Annex F (and does not require C11 at all,
+   for that matter).  */
+
+#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
+                             && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
+
 int
 FUNC (DOUBLE x)
 {
-#ifdef KNOWN_EXPBIT0_LOCATION
+#if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT
 # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
   /* Special CPU dependent code is needed to treat bit patterns outside the
      IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
@@ -153,8 +164,9 @@
   }
 # endif
 #else
-  /* The configuration did not find sufficient information.  Give up about
-     the signaling NaNs, handle only the quiet NaNs.  */
+  /* The configuration did not find sufficient information, or does
+     not use IEEE floating point.  Give up about the signaling NaNs;
+     handle only the quiet NaNs.  */
   if (x == x)
     {
 # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE