>From 42aae83cdfa531f247ca38d2f3408bffd2177ce0 Mon Sep 17 00:00:00 2001 From: Assaf Gordon Date: Wed, 16 Apr 2014 11:35:55 -0400 Subject: [PATCH] expl: avoid incorrect expl(small_value) on OpenBSD 5.4 OpenBSD 5.4, expl() incorrectly returns 'nan' for small values. Detect this and use gnulib's expl() in that case. 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 (gl_FUNC_EXPL): Add a check for this condition. * doc/posix-functions/expl.texi: Mention the workaround. --- ChangeLog | 6 ++++++ doc/posix-functions/expl.texi | 3 +++ m4/expl.m4 | 27 +++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6bf7c00..d4249b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-04-16 Assaf Gordon + + expl: avoid incorrect expl(small_value) on OpenBSD 5.4 + * m4/expl.m4 (gl_FUNC_EXPL): Add a check for this condition. + * doc/posix-functions/expl.texi: Mention the workaround. + 2014-04-12 Paul Eggert xalloc: allow x2nrealloc (P, PN, S) where P && !*PN diff --git a/doc/posix-functions/expl.texi b/doc/posix-functions/expl.texi index f198d00..633e684 100644 --- a/doc/posix-functions/expl.texi +++ b/doc/posix-functions/expl.texi @@ -12,6 +12,9 @@ Portability problems fixed by Gnulib: This function is missing on some platforms: FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin, Interix 3.5, BeOS. @item +This function returns NaN for small operands: +OpenBSD 5.4. address@hidden This function is only defined as a macro with arguments on some platforms: MSVC 9. @item diff --git a/m4/expl.m4 b/m4/expl.m4 index 247bc6e..3e41589 100644 --- a/m4/expl.m4 +++ b/m4/expl.m4 @@ -53,6 +53,33 @@ 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. Test for this anomaly. + if test $gl_cv_func_expl_no_libm = yes \ + || test $gl_cv_func_expl_in_libm = yes; then + AC_CACHE_CHECK([whether expl() breaks with small values], + [gl_cv_func_expl_buggy], + [ + save_LIBS="$LIBS" + LIBS="$EXPL_LIBM" + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[return isnan(expl(-1.0))|| + isnan(expl(-0.8))|| + isnan(expl(-0.4)); ]])], + [gl_cv_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 + 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.7.7.6