1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

fix tgamma for inifity

* configure.in: do not use buggy tgamma() of mingw.

* missing/tgamma.c (tgamma): merge fix for inifity from
  ruby_tgamma.  since msvcr120.dll and later have tgamma, this
  implementation will not be used.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-05-12 16:12:46 +00:00
parent ac6e069aef
commit 126aba8587
3 changed files with 22 additions and 16 deletions

View file

@ -1317,6 +1317,7 @@ main()
ac_cv_func___builtin_setjmp=no
ac_cv_func_round=no
])
ac_cv_func_tgamma=no
AC_CHECK_TYPE([NET_LUID], [], [],
[@%:@include <winsock2.h>
@%:@include <iphlpapi.h>])

16
math.c
View file

@ -778,22 +778,6 @@ math_erfc(VALUE unused_obj, VALUE x)
return DBL2NUM(erfc(Get_Double(x)));
}
#if defined _WIN32
static inline double
ruby_tgamma(const double d)
{
const double g = tgamma(d);
if (isinf(g)) {
if (d == 0.0 && signbit(d)) return -INFINITY;
}
if (isnan(g)) {
if (!signbit(d)) return INFINITY;
}
return g;
}
#define tgamma(d) ruby_tgamma(d)
#endif
#if defined LGAMMA_R_PM0_FIX
static inline double
ruby_lgamma_r(const double d, int *sign)

View file

@ -10,9 +10,25 @@ reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
gamma.c -- Gamma function
***********************************************************/
#include "ruby/config.h"
#include "ruby/missing.h"
#include <math.h>
#include <errno.h>
#ifdef _WIN32
# include <float.h>
# if !defined __MINGW32__ || defined __NO_ISOCEXT
# ifndef isnan
# define isnan(x) _isnan(x)
# endif
# ifndef isinf
# define isinf(x) (!_finite(x) && !_isnan(x))
# endif
# ifndef finite
# define finite(x) _finite(x)
# endif
# endif
#endif
#ifndef HAVE_LGAMMA_R
#include <errno.h>
@ -54,11 +70,16 @@ double tgamma(double x) /* Gamma function */
errno = ERANGE;
return 1/x < 0 ? -HUGE_VAL : HUGE_VAL;
}
if (isinf(x)) {
if (x < 0) goto domain_error;
return x;
}
if (x < 0) {
static double zero = 0.0;
double i, f;
f = modf(-x, &i);
if (f == 0.0) { /* Domain Error */
domain_error:
errno = EDOM;
return zero/zero;
}