frexp.m4 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # frexp.m4 serial 10
  2. dnl Copyright (C) 2007-2011 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. AC_DEFUN([gl_FUNC_FREXP],
  7. [
  8. AC_REQUIRE([gl_MATH_H_DEFAULTS])
  9. AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
  10. FREXP_LIBM=
  11. if test $gl_cv_func_frexp_no_libm = no; then
  12. AC_CACHE_CHECK([whether frexp() can be used with libm],
  13. [gl_cv_func_frexp_in_libm],
  14. [
  15. save_LIBS="$LIBS"
  16. LIBS="$LIBS -lm"
  17. AC_LINK_IFELSE(
  18. [AC_LANG_PROGRAM(
  19. [[#include <math.h>
  20. double x;]],
  21. [[int e; return frexp (x, &e) > 0;]])],
  22. [gl_cv_func_frexp_in_libm=yes],
  23. [gl_cv_func_frexp_in_libm=no])
  24. LIBS="$save_LIBS"
  25. ])
  26. if test $gl_cv_func_frexp_in_libm = yes; then
  27. FREXP_LIBM=-lm
  28. fi
  29. fi
  30. if test $gl_cv_func_frexp_no_libm = yes \
  31. || test $gl_cv_func_frexp_in_libm = yes; then
  32. save_LIBS="$LIBS"
  33. LIBS="$LIBS $FREXP_LIBM"
  34. gl_FUNC_FREXP_WORKS
  35. LIBS="$save_LIBS"
  36. case "$gl_cv_func_frexp_works" in
  37. *yes) gl_func_frexp=yes ;;
  38. *) gl_func_frexp=no; REPLACE_FREXP=1; FREXP_LIBM= ;;
  39. esac
  40. else
  41. gl_func_frexp=no
  42. fi
  43. if test $gl_func_frexp = yes; then
  44. AC_DEFINE([HAVE_FREXP], [1],
  45. [Define if the frexp() function is available and works.])
  46. else
  47. AC_LIBOBJ([frexp])
  48. fi
  49. AC_SUBST([FREXP_LIBM])
  50. ])
  51. AC_DEFUN([gl_FUNC_FREXP_NO_LIBM],
  52. [
  53. AC_REQUIRE([gl_MATH_H_DEFAULTS])
  54. AC_REQUIRE([gl_CHECK_FREXP_NO_LIBM])
  55. if test $gl_cv_func_frexp_no_libm = yes; then
  56. gl_FUNC_FREXP_WORKS
  57. case "$gl_cv_func_frexp_works" in
  58. *yes) gl_func_frexp_no_libm=yes ;;
  59. *) gl_func_frexp_no_libm=no; REPLACE_FREXP=1 ;;
  60. esac
  61. else
  62. gl_func_frexp_no_libm=no
  63. dnl Set REPLACE_FREXP here because the system may have frexp in libm.
  64. REPLACE_FREXP=1
  65. fi
  66. if test $gl_func_frexp_no_libm = yes; then
  67. AC_DEFINE([HAVE_FREXP_IN_LIBC], [1],
  68. [Define if the frexp() function is available in libc.])
  69. else
  70. AC_LIBOBJ([frexp])
  71. fi
  72. ])
  73. dnl Test whether frexp() can be used without linking with libm.
  74. dnl Set gl_cv_func_frexp_no_libm to 'yes' or 'no' accordingly.
  75. AC_DEFUN([gl_CHECK_FREXP_NO_LIBM],
  76. [
  77. AC_CACHE_CHECK([whether frexp() can be used without linking with libm],
  78. [gl_cv_func_frexp_no_libm],
  79. [
  80. AC_LINK_IFELSE(
  81. [AC_LANG_PROGRAM(
  82. [[#include <math.h>
  83. double x;]],
  84. [[int e; return frexp (x, &e) > 0;]])],
  85. [gl_cv_func_frexp_no_libm=yes],
  86. [gl_cv_func_frexp_no_libm=no])
  87. ])
  88. ])
  89. dnl Test whether frexp() works also on denormalized numbers (this fails e.g. on
  90. dnl NetBSD 3.0), on infinite numbers (this fails e.g. on IRIX 6.5 and mingw),
  91. dnl and on negative zero (this fails e.g. on NetBSD 4.99).
  92. AC_DEFUN([gl_FUNC_FREXP_WORKS],
  93. [
  94. AC_REQUIRE([AC_PROG_CC])
  95. AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
  96. AC_CACHE_CHECK([whether frexp works], [gl_cv_func_frexp_works],
  97. [
  98. AC_RUN_IFELSE(
  99. [AC_LANG_SOURCE([[
  100. #include <float.h>
  101. #include <math.h>
  102. #include <string.h>
  103. /* HP cc on HP-UX 10.20 has a bug with the constant expression -0.0.
  104. ICC 10.0 has a bug when optimizing the expression -zero.
  105. The expression -DBL_MIN * DBL_MIN does not work when cross-compiling
  106. to PowerPC on MacOS X 10.5. */
  107. #if defined __hpux || defined __sgi || defined __ICC
  108. static double
  109. compute_minus_zero (void)
  110. {
  111. return -DBL_MIN * DBL_MIN;
  112. }
  113. # define minus_zero compute_minus_zero ()
  114. #else
  115. double minus_zero = -0.0;
  116. #endif
  117. int main()
  118. {
  119. int result = 0;
  120. int i;
  121. volatile double x;
  122. double zero = 0.0;
  123. /* Test on denormalized numbers. */
  124. for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
  125. ;
  126. if (x > 0.0)
  127. {
  128. int exp;
  129. double y = frexp (x, &exp);
  130. /* On machines with IEEE754 arithmetic: x = 1.11254e-308, exp = -1022.
  131. On NetBSD: y = 0.75. Correct: y = 0.5. */
  132. if (y != 0.5)
  133. result |= 1;
  134. }
  135. /* Test on infinite numbers. */
  136. x = 1.0 / 0.0;
  137. {
  138. int exp;
  139. double y = frexp (x, &exp);
  140. if (y != x)
  141. result |= 2;
  142. }
  143. /* Test on negative zero. */
  144. x = minus_zero;
  145. {
  146. int exp;
  147. double y = frexp (x, &exp);
  148. if (memcmp (&y, &x, sizeof x))
  149. result |= 4;
  150. }
  151. return result;
  152. }]])],
  153. [gl_cv_func_frexp_works=yes],
  154. [gl_cv_func_frexp_works=no],
  155. [case "$host_os" in
  156. netbsd* | irix* | mingw*) gl_cv_func_frexp_works="guessing no";;
  157. *) gl_cv_func_frexp_works="guessing yes";;
  158. esac
  159. ])
  160. ])
  161. ])