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:
parent
ac6e069aef
commit
126aba8587
@ -1317,6 +1317,7 @@ main()
|
|||||||
ac_cv_func___builtin_setjmp=no
|
ac_cv_func___builtin_setjmp=no
|
||||||
ac_cv_func_round=no
|
ac_cv_func_round=no
|
||||||
])
|
])
|
||||||
|
ac_cv_func_tgamma=no
|
||||||
AC_CHECK_TYPE([NET_LUID], [], [],
|
AC_CHECK_TYPE([NET_LUID], [], [],
|
||||||
[@%:@include <winsock2.h>
|
[@%:@include <winsock2.h>
|
||||||
@%:@include <iphlpapi.h>])
|
@%:@include <iphlpapi.h>])
|
||||||
|
16
math.c
16
math.c
@ -778,22 +778,6 @@ math_erfc(VALUE unused_obj, VALUE x)
|
|||||||
return DBL2NUM(erfc(Get_Double(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
|
#if defined LGAMMA_R_PM0_FIX
|
||||||
static inline double
|
static inline double
|
||||||
ruby_lgamma_r(const double d, int *sign)
|
ruby_lgamma_r(const double d, int *sign)
|
||||||
|
@ -10,9 +10,25 @@ reference - Haruhiko Okumura: C-gengo niyoru saishin algorithm jiten
|
|||||||
gamma.c -- Gamma function
|
gamma.c -- Gamma function
|
||||||
***********************************************************/
|
***********************************************************/
|
||||||
#include "ruby/config.h"
|
#include "ruby/config.h"
|
||||||
|
#include "ruby/missing.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <errno.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
|
#ifndef HAVE_LGAMMA_R
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -54,11 +70,16 @@ double tgamma(double x) /* Gamma function */
|
|||||||
errno = ERANGE;
|
errno = ERANGE;
|
||||||
return 1/x < 0 ? -HUGE_VAL : HUGE_VAL;
|
return 1/x < 0 ? -HUGE_VAL : HUGE_VAL;
|
||||||
}
|
}
|
||||||
|
if (isinf(x)) {
|
||||||
|
if (x < 0) goto domain_error;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
static double zero = 0.0;
|
static double zero = 0.0;
|
||||||
double i, f;
|
double i, f;
|
||||||
f = modf(-x, &i);
|
f = modf(-x, &i);
|
||||||
if (f == 0.0) { /* Domain Error */
|
if (f == 0.0) { /* Domain Error */
|
||||||
|
domain_error:
|
||||||
errno = EDOM;
|
errno = EDOM;
|
||||||
return zero/zero;
|
return zero/zero;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user