summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--configure.in29
-rw-r--r--math.c3
3 files changed, 35 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index bedb3d99bd..d852674fa8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 12 23:57:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rb_cv_atan2_inf_c99): check whether runtime atan2
+ handles Inf as C99. ruby-core:62536] [Bug #9831]
+
Mon May 12 20:33:01 2014 Tanaka Akira <akr@fsij.org>
* configure.in: Invoke AC_REPLACE_FUNCS for each function.
diff --git a/configure.in b/configure.in
index ba40553c3f..cf317af87a 100644
--- a/configure.in
+++ b/configure.in
@@ -2145,6 +2145,35 @@ void qsort_r(void *base, size_t nmemb, size_t size,
])
fi
+AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
+ AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
+ AC_TRY_RUN([
+@%:@include <math.h>
+@%:@ifdef HAVE_UNISTD_H
+@%:@include <unistd.h>
+@%:@endif
+@%:@ifndef EXIT_SUCCESS
+@%:@define EXIT_SUCCESS 0
+@%:@endif
+@%:@ifndef EXIT_FAILURE
+@%:@define EXIT_FAILURE 1
+@%:@endif
+
+int
+main(int argc, char **argv)
+{
+ if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
+ return EXIT_FAILURE;
+}
+],
+ [rb_cv_atan2_inf_c99=yes],
+ [rb_cv_atan2_inf_c99=no],
+ [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
+ )
+ ])
+])
+AS_IF([test $rb_cv_atan2_inf_c99 = yes], [AC_DEFINE(ATAN2_INF_C99)])
+
# Some platform need -lrt for clock_gettime, but the other don't.
if test x"$ac_cv_func_clock_gettime" != xyes; then
# glibc 2.17 moves clock_* functions from librt to the main C library.
diff --git a/math.c b/math.c
index 8911de1360..78cba5ab0c 100644
--- a/math.c
+++ b/math.c
@@ -79,8 +79,7 @@ math_atan2(VALUE obj, VALUE y, VALUE x)
return DBL2NUM(M_PI);
return DBL2NUM(-M_PI);
}
-#if !(defined(HAVE_ATAN2L) && defined(HAVE_ATAN2F))
- /* assume atan2() doesn't handle Inf as C99 */
+#ifndef ATAN2_INF_C99
if (isinf(dx) && isinf(dy)) {
/* optimization for FLONUM */
if (dx < 0.0) {