Home | History | Annotate | Download | only in m4
      1 # frexpl.m4 serial 20
      2 dnl Copyright (C) 2007-2012 Free Software Foundation, Inc.
      3 dnl This file is free software; the Free Software Foundation
      4 dnl gives unlimited permission to copy and/or distribute it,
      5 dnl with or without modifications, as long as this notice is preserved.
      6 
      7 AC_DEFUN([gl_FUNC_FREXPL],
      8 [
      9   AC_REQUIRE([gl_MATH_H_DEFAULTS])
     10   AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
     11 
     12   dnl Persuade glibc <math.h> to declare frexpl().
     13   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
     14 
     15   dnl Check whether it's declared.
     16   dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
     17   AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
     18 
     19   FREXPL_LIBM=
     20   if test $HAVE_DECL_FREXPL = 1; then
     21     gl_CHECK_FREXPL_NO_LIBM
     22     if test $gl_cv_func_frexpl_no_libm = no; then
     23       AC_CACHE_CHECK([whether frexpl() can be used with libm],
     24         [gl_cv_func_frexpl_in_libm],
     25         [
     26           save_LIBS="$LIBS"
     27           LIBS="$LIBS -lm"
     28           AC_LINK_IFELSE(
     29             [AC_LANG_PROGRAM(
     30                [[#include <math.h>
     31                  long double x;]],
     32                [[int e; return frexpl (x, &e) > 0;]])],
     33             [gl_cv_func_frexpl_in_libm=yes],
     34             [gl_cv_func_frexpl_in_libm=no])
     35           LIBS="$save_LIBS"
     36         ])
     37       if test $gl_cv_func_frexpl_in_libm = yes; then
     38         FREXPL_LIBM=-lm
     39       fi
     40     fi
     41     if test $gl_cv_func_frexpl_no_libm = yes \
     42        || test $gl_cv_func_frexpl_in_libm = yes; then
     43       save_LIBS="$LIBS"
     44       LIBS="$LIBS $FREXPL_LIBM"
     45       gl_FUNC_FREXPL_WORKS
     46       LIBS="$save_LIBS"
     47       case "$gl_cv_func_frexpl_works" in
     48         *yes) gl_func_frexpl=yes ;;
     49         *)    gl_func_frexpl=no; REPLACE_FREXPL=1 ;;
     50       esac
     51     else
     52       gl_func_frexpl=no
     53     fi
     54     if test $gl_func_frexpl = yes; then
     55       AC_DEFINE([HAVE_FREXPL], [1],
     56         [Define if the frexpl() function is available.])
     57     fi
     58   fi
     59   if test $HAVE_DECL_FREXPL = 0 || test $gl_func_frexpl = no; then
     60     dnl Find libraries needed to link lib/frexpl.c.
     61     if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
     62       AC_REQUIRE([gl_FUNC_FREXP])
     63       FREXPL_LIBM="$FREXP_LIBM"
     64     else
     65       FREXPL_LIBM=
     66     fi
     67   fi
     68   AC_SUBST([FREXPL_LIBM])
     69 ])
     70 
     71 AC_DEFUN([gl_FUNC_FREXPL_NO_LIBM],
     72 [
     73   AC_REQUIRE([gl_MATH_H_DEFAULTS])
     74   AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
     75   dnl Check whether it's declared.
     76   dnl Mac OS X 10.3 has frexpl() in libc but doesn't declare it in <math.h>.
     77   AC_CHECK_DECL([frexpl], , [HAVE_DECL_FREXPL=0], [[#include <math.h>]])
     78   if test $HAVE_DECL_FREXPL = 1; then
     79     gl_CHECK_FREXPL_NO_LIBM
     80     if test $gl_cv_func_frexpl_no_libm = yes; then
     81       gl_FUNC_FREXPL_WORKS
     82       case "$gl_cv_func_frexpl_works" in
     83         *yes) gl_func_frexpl_no_libm=yes ;;
     84         *)    gl_func_frexpl_no_libm=no; REPLACE_FREXPL=1 ;;
     85       esac
     86     else
     87       gl_func_frexpl_no_libm=no
     88       dnl Set REPLACE_FREXPL here because the system may have frexpl in libm.
     89       REPLACE_FREXPL=1
     90     fi
     91     if test $gl_func_frexpl_no_libm = yes; then
     92       AC_DEFINE([HAVE_FREXPL_IN_LIBC], [1],
     93         [Define if the frexpl() function is available in libc.])
     94     fi
     95   fi
     96 ])
     97 
     98 dnl Test whether frexpl() can be used without linking with libm.
     99 dnl Set gl_cv_func_frexpl_no_libm to 'yes' or 'no' accordingly.
    100 AC_DEFUN([gl_CHECK_FREXPL_NO_LIBM],
    101 [
    102   AC_CACHE_CHECK([whether frexpl() can be used without linking with libm],
    103     [gl_cv_func_frexpl_no_libm],
    104     [
    105       AC_LINK_IFELSE(
    106         [AC_LANG_PROGRAM(
    107            [[#include <math.h>
    108              long double x;]],
    109            [[int e; return frexpl (x, &e) > 0;]])],
    110         [gl_cv_func_frexpl_no_libm=yes],
    111         [gl_cv_func_frexpl_no_libm=no])
    112     ])
    113 ])
    114 
    115 dnl Test whether frexpl() works on finite numbers (this fails on
    116 dnl Mac OS X 10.4/PowerPC, on AIX 5.1, and on BeOS), on denormalized numbers
    117 dnl (this fails on Mac OS X 10.5/i386), and also on infinite numbers (this
    118 dnl fails e.g. on IRIX 6.5 and mingw).
    119 AC_DEFUN([gl_FUNC_FREXPL_WORKS],
    120 [
    121   AC_REQUIRE([AC_PROG_CC])
    122   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
    123   AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works],
    124     [
    125       AC_RUN_IFELSE(
    126         [AC_LANG_SOURCE([[
    127 #include <float.h>
    128 #include <math.h>
    129 /* Override the values of <float.h>, like done in float.in.h.  */
    130 #if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
    131 # undef LDBL_MIN_EXP
    132 # define LDBL_MIN_EXP    (-16381)
    133 #endif
    134 #if defined __i386__ && defined __FreeBSD__
    135 # undef LDBL_MIN_EXP
    136 # define LDBL_MIN_EXP    (-16381)
    137 #endif
    138 #if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
    139 # undef LDBL_MIN_EXP
    140 # define LDBL_MIN_EXP DBL_MIN_EXP
    141 #endif
    142 #if defined __sgi && (LDBL_MANT_DIG >= 106)
    143 # if defined __GNUC__
    144 #  undef LDBL_MIN_EXP
    145 #  define LDBL_MIN_EXP DBL_MIN_EXP
    146 # endif
    147 #endif
    148 extern
    149 #ifdef __cplusplus
    150 "C"
    151 #endif
    152 long double frexpl (long double, int *);
    153 int main()
    154 {
    155   int result = 0;
    156   volatile long double x;
    157   /* Test on finite numbers that fails on AIX 5.1.  */
    158   x = 16.0L;
    159   {
    160     int exp = -9999;
    161     frexpl (x, &exp);
    162     if (exp != 5)
    163       result |= 1;
    164   }
    165   /* Test on finite numbers that fails on Mac OS X 10.4, because its frexpl
    166      function returns an invalid (incorrectly normalized) value: it returns
    167                y = { 0x3fe028f5, 0xc28f5c28, 0x3c9eb851, 0xeb851eb8 }
    168      but the correct result is
    169           0.505L = { 0x3fe028f5, 0xc28f5c29, 0xbc547ae1, 0x47ae1480 }  */
    170   x = 1.01L;
    171   {
    172     int exp = -9999;
    173     long double y = frexpl (x, &exp);
    174     if (!(exp == 1 && y == 0.505L))
    175       result |= 2;
    176   }
    177   /* Test on large finite numbers.  This fails on BeOS at i = 16322, while
    178      LDBL_MAX_EXP = 16384.
    179      In the loop end test, we test x against Infinity, rather than comparing
    180      i with LDBL_MAX_EXP, because BeOS <float.h> has a wrong LDBL_MAX_EXP.  */
    181   {
    182     int i;
    183     for (i = 1, x = 1.0L; x != x + x; i++, x *= 2.0L)
    184       {
    185         int exp = -9999;
    186         frexpl (x, &exp);
    187         if (exp != i)
    188           {
    189             result |= 4;
    190             break;
    191           }
    192       }
    193   }
    194   /* Test on denormalized numbers.  */
    195   {
    196     int i;
    197     for (i = 1, x = 1.0L; i >= LDBL_MIN_EXP; i--, x *= 0.5L)
    198       ;
    199     if (x > 0.0L)
    200       {
    201         int exp;
    202         long double y = frexpl (x, &exp);
    203         /* On machines with IEEE854 arithmetic: x = 1.68105e-4932,
    204            exp = -16382, y = 0.5.  On Mac OS X 10.5: exp = -16384, y = 0.5.  */
    205         if (exp != LDBL_MIN_EXP - 1)
    206           result |= 8;
    207       }
    208   }
    209   /* Test on infinite numbers.  */
    210   x = 1.0L / 0.0L;
    211   {
    212     int exp;
    213     long double y = frexpl (x, &exp);
    214     if (y != x)
    215       result |= 16;
    216   }
    217   return result;
    218 }]])],
    219         [gl_cv_func_frexpl_works=yes],
    220         [gl_cv_func_frexpl_works=no],
    221         [
    222 changequote(,)dnl
    223          case "$host_os" in
    224            aix | aix[3-6]* | beos* | darwin* | irix* | mingw* | pw*)
    225               gl_cv_func_frexpl_works="guessing no";;
    226            *) gl_cv_func_frexpl_works="guessing yes";;
    227          esac
    228 changequote([,])dnl
    229         ])
    230     ])
    231 ])
    232