Hello,

On 04/15/2014 01:34 PM, Pádraig Brady wrote:
On 04/15/2014 05:18 PM, Assaf Gordon wrote:
+  dnl On some systems (OpenBSD5.4) the system's native expl() is buggy:
+  dnl it returns 'nan' for small values. This test compares expl() to exp() .

You might assume that fabs is in the same lib as expl?
So this FABS_LIBM var is probably best left out,
as it's not guaranteed set here.
<...>
Is checking this whole range necessary?
<...>
s/in/ion/
<...>
You could just move the whole block earlier in the function to line 55,
so that the subsequent check of $gl_cv_func_expl_in_libm etc. is significant?


Attached is an improved version, changed according to your suggestions.
It now uses Gnulib's expl on OpenBSD5.4, and the native expl on other systems.


Regards,
 -gordon


>From e5e007412f004532d3a6f4226b7aa69f9fc43410 Mon Sep 17 00:00:00 2001
From: "A. Gordon" <agor...@wi.mit.edu>
Date: Wed, 16 Apr 2014 11:35:55 -0400
Subject: [PATCH] m4: tests for buggy expl() implementations

On OpenBSD 5.4, expl() incorrectly returns 'nan' for
small values. Detect this and use Gnulib's expl if needed.

Discussed here:
http://marc.info/?t=139159081700002&r=1&w=2
(Message from David Coppa on 2014-02-05 to openbsd-tech mailing list).

Fixed here (in revision 1.2):
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libm/src/ld128/s_floorl.c
---
 m4/expl.m4 | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/m4/expl.m4 b/m4/expl.m4
index 247bc6e..1fa84cc 100644
--- a/m4/expl.m4
+++ b/m4/expl.m4
@@ -53,6 +53,35 @@ AC_DEFUN([gl_FUNC_EXPL],
       EXPL_LIBM=-lm
     fi
   fi
+  dnl On OpenBSD5.4 the system's native expl() is buggy:
+  dnl it returns 'nan' for small values. Tests for this anomaly.
+  if test $gl_cv_func_expl_no_libm = yes \
+     || test $gl_cv_func_expl_in_libm = yes; then
+    AC_CACHE_CHECK([checks whether expl is buggy],
+        [gl_cv_func_expl_buggy],
+        [
+          save_LIBS="$LIBS"
+          LIBS="$EXPL_LIBM"
+          AC_RUN_IFELSE(
+           [AC_LANG_PROGRAM(
+             [[#include <math.h>
+]],          [[return isnan(expl(-1.0))||
+                      isnan(expl(-0.8))||
+                      isnan(expl(-0.4)); ]])],
+             [gl_cv_func_func_expl_buggy=no], [gl_cv_func_expl_buggy=yes],
+             [case $host_os in
+                mingw*) gl_cv_func_expl_buggy="guessing no";;
+                *) gl_cv_func_expl_buggy="guessing yes";;
+              esac])
+          LIBS="$save_LIBS"
+        ])
+    if test $gl_cv_func_expl_buggy = yes; then
+      dnl TODO: Use gnulib's expl instead of the system's expl
+      AC_MSG_NOTICE([Detected buggy expl(), using gnulib's implementation])
+      gl_cv_func_expl_in_libm=no
+      gl_cv_func_expl_no_libm=no
+    fi
+  fi
   if test $gl_cv_func_expl_no_libm = yes \
      || test $gl_cv_func_expl_in_libm = yes; then
     dnl Also check whether it's declared.
-- 
1.9.1

Reply via email to