bug-gnulib
[Top][All Lists]
Advanced

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

frexpl: avoid bug on IRIX


From: Bruno Haible
Subject: frexpl: avoid bug on IRIX
Date: Sun, 25 Mar 2007 23:36:06 +0200
User-agent: KMail/1.5.4

frexpl(Infinity) on IRIX 6.5 does not return Infinity, as it should according to
POSIX/MX. I'm adding a configure check against it:

2007-03-25  Bruno Haible  <address@hidden>

        * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): New macro.
        (gl_FUNC_FREXPL): Invoke it. Set REPLACE_FREXPL to 1 if it frexpl
        exists but doesn't work.
        * lib/math_.h (frexpl): Define as a replacement macro if REPLACE_FREXPL
        is set. Don't provide a prototype if REPLACE_FREXPL is not set.
        * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_FREXPL.
        * modules/math (Makefile.am) Substibute also REPLACE_FREXPL into math.h.

*** m4/frexpl.m4        23 Mar 2007 01:26:24 -0000      1.1
--- m4/frexpl.m4        25 Mar 2007 21:26:37 -0000
***************
*** 1,4 ****
! # frexpl.m4 serial 1
  dnl Copyright (C) 2007 Free Software Foundation, Inc.
  dnl This file is free software; the Free Software Foundation
  dnl gives unlimited permission to copy and/or distribute it,
--- 1,4 ----
! # frexpl.m4 serial 2
  dnl Copyright (C) 2007 Free Software Foundation, Inc.
  dnl This file is free software; the Free Software Foundation
  dnl gives unlimited permission to copy and/or distribute it,
***************
*** 36,41 ****
--- 36,53 ----
    fi
    if test $gl_cv_func_frexpl_no_libm = yes \
       || test $gl_cv_func_frexpl_in_libm = yes; then
+     save_LIBS="$LIBS"
+     LIBS="$LIBS $FREXPL_LIBM"
+     gl_FUNC_FREXPL_WORKS
+     LIBS="$save_LIBS"
+     case "$gl_cv_func_frexpl_works" in
+       *yes) gl_func_frexpl=yes ;;
+       *)    gl_func_frexpl=no; REPLACE_FREXPL=1; FREXPL_LIBM= ;;
+     esac
+   else
+     gl_func_frexpl=no
+   fi
+   if test $gl_func_frexpl = yes; then
      AC_DEFINE([HAVE_FREXPL], 1,
        [Define if the frexpl() function is available.])
      dnl Also check whether it's declared.
***************
*** 45,47 ****
--- 57,90 ----
      AC_LIBOBJ([frexpl])
    fi
  ])
+ 
+ dnl Test whether frexpl() works also on infinite numbers (this fails e.g. on
+ dnl IRIX 6.5).
+ AC_DEFUN([gl_FUNC_FREXPL_WORKS],
+ [
+   AC_REQUIRE([AC_PROG_CC])
+   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+   AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
+     [
+       AC_TRY_RUN([
+ #include <math.h>
+ int main()
+ {
+   volatile long double x;
+   /* Test on infinite numbers.  */
+   {
+     x = 1.0L / 0.0L;
+     int exp;
+     long double y = frexpl (x, &exp);
+     if (y != x)
+       return 1;
+   }
+   return 0;
+ }], [gl_cv_func_frexpl_works=yes], [gl_cv_func_frexpl_works=no],
+       [case "$host_os" in
+          irix*) gl_cv_func_frexpl_works="guessing no";;
+          *)     gl_cv_func_frexpl_works="guessing yes";;
+        esac
+       ])
+     ])
+ ])
*** m4/math_h.m4        23 Mar 2007 01:26:24 -0000      1.4
--- m4/math_h.m4        25 Mar 2007 21:26:37 -0000
***************
*** 39,42 ****
--- 39,43 ----
    HAVE_DECL_SQRTL=1;  AC_SUBST([HAVE_DECL_SQRTL])
    HAVE_DECL_TANL=1;   AC_SUBST([HAVE_DECL_TANL])
    REPLACE_FREXP=0;    AC_SUBST([REPLACE_FREXP])
+   REPLACE_FREXPL=0;   AC_SUBST([REPLACE_FREXPL])
  ])
*** lib/math_.h 23 Mar 2007 03:06:51 -0000      1.6
--- lib/math_.h 25 Mar 2007 21:26:37 -0000
***************
*** 135,141 ****
       If x is zero: mantissa = x, exp = 0.
       If x is infinite or NaN: mantissa = x, exp unspecified.
     Store exp and return mantissa.  */
! #if @GNULIB_FREXPL@ || address@hidden@
  extern long double frexpl (long double x, int *exp);
  #endif
  #if address@hidden@ && defined GNULIB_POSIXCHECK
--- 135,144 ----
       If x is zero: mantissa = x, exp = 0.
       If x is infinite or NaN: mantissa = x, exp unspecified.
     Store exp and return mantissa.  */
! #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
! # define frexpl rpl_frexpl
! #endif
! #if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || address@hidden@
  extern long double frexpl (long double x, int *exp);
  #endif
  #if address@hidden@ && defined GNULIB_POSIXCHECK
*** modules/math        23 Mar 2007 01:26:24 -0000      1.4
--- modules/math        25 Mar 2007 21:26:37 -0000
***************
*** 38,43 ****
--- 38,44 ----
              -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \
              -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \
              -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \
+             -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \
              -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
              < $(srcdir)/math_.h; \
        } > address@hidden





reply via email to

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