diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-12 16:12:46 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-12 16:12:46 +0000 |
commit | 126aba858724e935f4d1fd735621f997575eb871 (patch) | |
tree | 9651cc4e0c45d2e48220c60342c4443b4c3349d0 /missing | |
parent | ac6e069aef98e8e94617b964284cb682126d8727 (diff) | |
download | ruby-126aba858724e935f4d1fd735621f997575eb871.tar.gz |
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
Diffstat (limited to 'missing')
-rw-r--r-- | missing/tgamma.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/missing/tgamma.c b/missing/tgamma.c index 9324e19ea1..6260e4f519 100644 --- a/missing/tgamma.c +++ b/missing/tgamma.c @@ -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; } |