gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gcl-devel] Re: Building GCL 2.6.1 on FreeBSD 4.8


From: Magnus Henoch
Subject: [Gcl-devel] Re: Building GCL 2.6.1 on FreeBSD 4.8
Date: Tue, 25 May 2004 11:00:33 +0200
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

Now I've written a better isnormal:

--- orig/acconfig.h
+++ mod/acconfig.h
@@ -166,8 +166,12 @@
 #include <ieeefp.h>
 #define ISNORMAL(a) (fpclass(a)>=FP_NZERO)
 #else
-#include <math.h>
-#define ISNORMAL(a) (finite(a) && (a) != 0.0)
+#define NEED_OWN_ISNORMAL
+int gcl_isnormal_double(double d);
+int gcl_isnormal_float(float f);
+#define ISNORMAL(a) ((sizeof (a) == sizeof (float)) ? \
+                    gcl_isnormal_float(a) : \
+                    gcl_isnormal_double(a))
 #endif
 #endif
 #endif


--- orig/o/num_co.c
+++ mod/o/num_co.c
@@ -29,6 +29,7 @@
 #define IN_NUM_CO
 
 #define NEED_MP_H
+#define NEED_ISFINITE
 
 #include "include.h"
 #include "num_include.h"
@@ -39,6 +40,63 @@
 #define VAX
 #endif
 
+#ifdef NEED_OWN_ISNORMAL
+/* NEED_OWN_ISNORMAL is defined when the system doesn't provide a
+   useful isnormal function.
+
+   A number is normal when:
+   * it is finite,
+   * it is not zero, and
+   * its exponent is non-zero.
+*/
+int gcl_isnormal_double(double d)
+{
+  union {double d;int i[2];} u;
+
+  if (!ISFINITE(d))
+    return 0;
+
+  if (d == 0.0)
+    return 0;
+
+#ifdef VAX
+#error gcl_isnormal_double not implemented for VAX
+#endif
+#ifdef IEEEFLOAT
+  u.d = d;
+  return (u.i[HIND] & 0x7ff00000) != 0;
+#endif
+#ifdef S3000
+#error gcl_isnormal_double not implemented for S3000
+#endif
+
+}
+
+int gcl_isnormal_float(float f)
+{
+  union {float f;int i;} u;
+
+  if (!ISFINITE(f))
+    return 0;
+
+  if (f == 0.0)
+    return 0;
+
+#ifdef VAX
+#error gcl_isnormal_float not implemented for VAX
+#endif
+#ifdef IEEEFLOAT
+  u.f = f;
+  return (u.i & 0x7f800000) != 0;
+#endif
+#ifdef S3000
+#error gcl_isnormal_float not implemented for S3000
+#endif
+
+}
+
+#endif /* NEED_OWN_ISNORMAL */
+
 #ifdef VAX
 /*
        radix = 2


Testing it with your program gave identical results to glibc
isnormal - on Debian/i386, that is; I don't have access to other
hardware.

My new functions simply bail out on VAX and S3000.

Regards,
Magnus

reply via email to

[Prev in Thread] Current Thread [Next in Thread]