summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/math/test/test_gamma_hooks.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/math/test/test_gamma_hooks.hpp')
-rw-r--r--src/boost/libs/math/test/test_gamma_hooks.hpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/boost/libs/math/test/test_gamma_hooks.hpp b/src/boost/libs/math/test/test_gamma_hooks.hpp
new file mode 100644
index 00000000..b07c5b83
--- /dev/null
+++ b/src/boost/libs/math/test/test_gamma_hooks.hpp
@@ -0,0 +1,281 @@
+// (C) Copyright John Maddock 2006.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_TEST_GAMMA_OTHER_HOOKS_HPP
+#define BOOST_MATH_TEST_GAMMA_OTHER_HOOKS_HPP
+
+#ifdef TEST_CEPHES
+namespace other{
+extern "C" {
+ double gamma(double);
+ float gammaf(float);
+ long double gammal(long double);
+ double lgam(double);
+ float lgamf(float);
+ long double lgaml(long double);
+ float igamf(float, float);
+ double igam(double, double);
+ long double igaml(long double, long double);
+ float igamcf(float, float);
+ double igamc(double, double);
+ long double igamcl(long double, long double);
+}
+inline float tgamma(float x)
+{ return gammaf(x); }
+inline double tgamma(double x)
+{ return gamma(x); }
+inline long double tgamma(long double x)
+{
+#ifdef BOOST_MSVC
+ return gamma((double)x);
+#else
+ return gammal(x);
+#endif
+}
+inline float lgamma(float x)
+{ return lgamf(x); }
+inline double lgamma(double x)
+{ return lgam(x); }
+inline long double lgamma(long double x)
+{
+#ifdef BOOST_MSVC
+ return lgam((double)x);
+#else
+ return lgaml(x);
+#endif
+}
+inline float gamma_q(float x, float y)
+{ return igamcf(x, y); }
+inline double gamma_q(double x, double y)
+{ return igamc(x, y); }
+inline long double gamma_q(long double x, long double y)
+{
+#ifdef BOOST_MSVC
+ return igamc((double)x, (double)y);
+#else
+ return igamcl(x, y);
+#endif
+}
+inline float gamma_p(float x, float y)
+{ return igamf(x, y); }
+inline double gamma_p(double x, double y)
+{ return igam(x, y); }
+inline long double gamma_p(long double x, long double y)
+{
+#ifdef BOOST_MSVC
+ return igam((double)x, (double)y);
+#else
+ return igaml(x, y);
+#endif
+}
+}
+#define TEST_OTHER
+#endif
+
+#ifdef TEST_NATIVE
+#include <math.h>
+namespace other{
+#if defined(__FreeBSD__)
+// no float version:
+inline float tgamma(float x)
+{ return ::tgamma(x); }
+#else
+inline float tgamma(float x)
+{ return ::tgammaf(x); }
+#endif
+inline double tgamma(double x)
+{ return ::tgamma(x); }
+inline long double tgamma(long double x)
+{
+#if defined(__CYGWIN__) || defined(__FreeBSD__)
+ // no long double versions:
+ return ::tgamma(x);
+#else
+ return ::tgammal(x);
+#endif
+}
+#if defined(__FreeBSD__)
+inline float lgamma(float x)
+{ return ::lgamma(x); }
+#else
+inline float lgamma(float x)
+{ return ::lgammaf(x); }
+#endif
+inline double lgamma(double x)
+{ return ::lgamma(x); }
+inline long double lgamma(long double x)
+{
+#if defined(__CYGWIN__) || defined(__FreeBSD__)
+ // no long double versions:
+ return ::lgamma(x);
+#else
+ return ::lgammal(x);
+#endif
+}
+}
+#define TEST_OTHER
+#endif
+
+#ifdef TEST_GSL
+#define TEST_OTHER
+#include <gsl/gsl_sf_gamma.h>
+
+namespace other{
+float tgamma(float z)
+{
+ return (float)gsl_sf_gamma(z);
+}
+double tgamma(double z)
+{
+ return gsl_sf_gamma(z);
+}
+long double tgamma(long double z)
+{
+ return gsl_sf_gamma(z);
+}
+float lgamma(float z)
+{
+ return (float)gsl_sf_lngamma(z);
+}
+double lgamma(double z)
+{
+ return gsl_sf_lngamma(z);
+}
+long double lgamma(long double z)
+{
+ return gsl_sf_lngamma(z);
+}
+inline float gamma_q(float x, float y)
+{ return (float)gsl_sf_gamma_inc_Q(x, y); }
+inline double gamma_q(double x, double y)
+{ return gsl_sf_gamma_inc_Q(x, y); }
+inline long double gamma_q(long double x, long double y)
+{ return gsl_sf_gamma_inc_Q(x, y); }
+inline float gamma_p(float x, float y)
+{ return (float)gsl_sf_gamma_inc_P(x, y); }
+inline double gamma_p(double x, double y)
+{ return gsl_sf_gamma_inc_P(x, y); }
+inline long double gamma_p(long double x, long double y)
+{ return gsl_sf_gamma_inc_P(x, y); }
+}
+#endif
+
+#ifdef TEST_DCDFLIB
+#define TEST_OTHER
+#include <dcdflib.h>
+
+namespace other{
+float tgamma(float z)
+{
+ double v = z;
+ return (float)gamma_x(&v);
+}
+double tgamma(double z)
+{
+ return gamma_x(&z);
+}
+long double tgamma(long double z)
+{
+ double v = z;
+ return gamma_x(&v);
+}
+float lgamma(float z)
+{
+ double v = z;
+ return (float)gamma_log(&v);
+}
+double lgamma(double z)
+{
+ double v = z;
+ return gamma_log(&v);
+}
+long double lgamma(long double z)
+{
+ double v = z;
+ return gamma_log(&v);
+}
+inline double gamma_q(double x, double y)
+{
+ double ans, qans;
+ int i = 0;
+ gamma_inc (&x, &y, &ans, &qans, &i);
+ return qans;
+}
+inline float gamma_q(float x, float y)
+{
+ return (float)gamma_q((double)x, (double)y);
+}
+inline long double gamma_q(long double x, long double y)
+{
+ return gamma_q((double)x, (double)y);
+}
+inline double gamma_p(double x, double y)
+{
+ double ans, qans;
+ int i = 0;
+ gamma_inc (&x, &y, &ans, &qans, &i);
+ return ans;
+}
+inline float gamma_p(float x, float y)
+{
+ return (float)gamma_p((double)x, (double)y);
+}
+inline long double gamma_p(long double x, long double y)
+{
+ return gamma_p((double)x, (double)y);
+}
+
+inline double gamma_q_inv(double x, double y)
+{
+ double ans, p, nul;
+ int i = 0;
+ p = 1 - y;
+ nul = 0;
+ gamma_inc_inv (&x, &ans, &nul, &p, &y, &i);
+ return ans;
+}
+inline float gamma_q_inv(float x, float y)
+{
+ return (float)gamma_q_inv((double)x, (double)y);
+}
+inline long double gamma_q_inv(long double x, long double y)
+{
+ return gamma_q_inv((double)x, (double)y);
+}
+inline double gamma_p_inv(double x, double y)
+{
+ double ans, p, nul;
+ int i = 0;
+ p = 1 - y;
+ nul = 0;
+ gamma_inc_inv (&x, &ans, &nul, &y, &p, &i);
+ return ans;
+}
+inline float gamma_p_inv(float x, float y)
+{
+ return (float)gamma_p_inv((double)x, (double)y);
+}
+inline long double gamma_p_inv(long double x, long double y)
+{
+ return gamma_p_inv((double)x, (double)y);
+}
+
+}
+#endif
+
+#ifdef TEST_OTHER
+namespace other{
+ boost::math::concepts::real_concept tgamma(boost::math::concepts::real_concept){ return 0; }
+ boost::math::concepts::real_concept lgamma(boost::math::concepts::real_concept){ return 0; }
+ boost::math::concepts::real_concept gamma_q(boost::math::concepts::real_concept, boost::math::concepts::real_concept){ return 0; }
+ boost::math::concepts::real_concept gamma_p(boost::math::concepts::real_concept, boost::math::concepts::real_concept){ return 0; }
+ boost::math::concepts::real_concept gamma_p_inv(boost::math::concepts::real_concept x, boost::math::concepts::real_concept y){ return 0; }
+ boost::math::concepts::real_concept gamma_q_inv(boost::math::concepts::real_concept x, boost::math::concepts::real_concept y){ return 0; }
+}
+#endif
+
+#endif
+
+