X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=m4%2Fmodf.m4;h=20163f7e8c475c86cc9817c413393fd6b4b0de57;hb=3386f3988ce2ab14d65f59659d8f95bf4830ecb3;hp=03ee50b27eafc4cd8a7c84a1361e1f7371fc780d;hpb=e8b58a0f7e4b3ceb67460e953fe443a6ddd52675;p=gnulib.git diff --git a/m4/modf.m4 b/m4/modf.m4 index 03ee50b27..20163f7e8 100644 --- a/m4/modf.m4 +++ b/m4/modf.m4 @@ -1,11 +1,83 @@ -# modf.m4 serial 1 -dnl Copyright (C) 2011 Free Software Foundation, Inc. +# modf.m4 serial 3 +dnl Copyright (C) 2011-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_MODF], [ + m4_divert_text([DEFAULTS], [gl_modf_required=plain]) + AC_REQUIRE([gl_MATH_H_DEFAULTS]) + dnl Determine MODF_LIBM. gl_MATHFUNC([modf], [double], [(double, double *)]) + + m4_ifdef([gl_FUNC_MODF_IEEE], [ + if test $gl_modf_required = ieee && test $REPLACE_MODF = 0; then + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether modf works according to ISO C 99 with IEC 60559], + [gl_cv_func_modf_ieee], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $MODF_LIBM" + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#ifndef __NO_MATH_INLINES +# define __NO_MATH_INLINES 1 /* for glibc */ +#endif +#include +]gl_DOUBLE_MINUS_ZERO_CODE[ +]gl_DOUBLE_SIGNBIT_CODE[ +/* Compare two numbers with ==. + This is a separate function because IRIX 6.5 "cc -O" miscompiles an + 'x == x' test. */ +static int +numeric_equal (double x, double y) +{ + return x == y; +} +static double dummy (double x, double *iptr) { return 0; } +double zero; +double minus_one = - 1.0; +int main (int argc, char *argv[]) +{ + double (*my_modf) (double, double *) = argc ? modf : dummy; + int result = 0; + double i; + double f; + /* Test modf(NaN,...). + This test fails on NetBSD 5.1, Cygwin. */ + f = my_modf (zero / zero, &i); + if (numeric_equal (f, f)) + result |= 1; + /* Test modf(-Inf,...). + This test fails on FreeBSD 6.4, OpenBSD 4.9, IRIX 6.5, OSF/1 5.1. */ + f = my_modf (minus_one / zero, &i); + if (!(f == 0.0) || (signbitd (minus_zerod) && !signbitd (f))) + result |= 2; + return result; +} + ]])], + [gl_cv_func_modf_ieee=yes], + [gl_cv_func_modf_ieee=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu*) gl_cv_func_modf_ieee="guessing yes" ;; + # If we don't know, assume the worst. + *) gl_cv_func_modf_ieee="guessing no" ;; + esac + ]) + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_modf_ieee" in + *yes) ;; + *) REPLACE_MODF=1 ;; + esac + fi + ]) + if test $REPLACE_MODF = 1; then + dnl Find libraries needed to link lib/modf.c. + AC_REQUIRE([gl_FUNC_TRUNC]) + MODF_LIBM="$TRUNC_LIBM" + fi ])