]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright John Maddock 2007. |
2 | // Use, modification and distribution are subject to the | |
3 | // Boost Software License, Version 1.0. (See accompanying file | |
4 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | #define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error | |
7 | #include <boost/math/concepts/real_concept.hpp> | |
8 | #define BOOST_TEST_MAIN | |
9 | #include <boost/test/unit_test.hpp> | |
10 | #include <boost/test/floating_point_comparison.hpp> | |
11 | #include <boost/math/special_functions/math_fwd.hpp> | |
12 | #include <boost/type_traits/is_floating_point.hpp> | |
13 | #include <boost/array.hpp> | |
14 | #include "functor.hpp" | |
15 | ||
16 | #include "handle_test_result.hpp" | |
17 | #include "table_type.hpp" | |
18 | ||
19 | #ifndef SC_ | |
20 | # define SC_(x) static_cast<typename table_type<T>::type>(BOOST_JOIN(x, L)) | |
21 | #endif | |
22 | ||
23 | template <class T> | |
24 | T cyl_bessel_i_int_wrapper(T v, T x) | |
25 | { | |
26 | #ifdef BESSEL_IN_FUNCTION_TO_TEST | |
27 | return static_cast<T>( | |
28 | BESSEL_IN_FUNCTION_TO_TEST( | |
29 | boost::math::itrunc(v), x)); | |
30 | #else | |
31 | return static_cast<T>( | |
32 | boost::math::cyl_bessel_i( | |
33 | boost::math::itrunc(v), x)); | |
34 | #endif | |
35 | } | |
36 | ||
37 | template <class Real, class T> | |
38 | void do_test_cyl_bessel_i(const T& data, const char* type_name, const char* test_name) | |
39 | { | |
40 | #if !(defined(ERROR_REPORTING_MODE) && !defined(BESSEL_I_FUNCTION_TO_TEST)) | |
41 | typedef Real value_type; | |
42 | ||
43 | typedef value_type (*pg)(value_type, value_type); | |
44 | #ifdef BESSEL_I_FUNCTION_TO_TEST | |
45 | pg funcp = BESSEL_I_FUNCTION_TO_TEST; | |
46 | #elif defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) | |
47 | pg funcp = boost::math::cyl_bessel_i<value_type, value_type>; | |
48 | #else | |
49 | pg funcp = boost::math::cyl_bessel_i; | |
50 | #endif | |
51 | ||
52 | boost::math::tools::test_result<value_type> result; | |
53 | ||
54 | std::cout << "Testing " << test_name << " with type " << type_name | |
55 | << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; | |
56 | ||
57 | // | |
58 | // test cyl_bessel_i against data: | |
59 | // | |
60 | result = boost::math::tools::test_hetero<Real>( | |
61 | data, | |
62 | bind_func<Real>(funcp, 0, 1), | |
63 | extract_result<Real>(2)); | |
64 | handle_test_result(result, data[result.worst()], result.worst(), type_name, "cyl_bessel_i", test_name); | |
65 | std::cout << std::endl; | |
66 | ||
67 | #endif | |
68 | } | |
69 | ||
70 | template <class Real, class T> | |
71 | void do_test_cyl_bessel_i_int(const T& data, const char* type_name, const char* test_name) | |
72 | { | |
73 | #if !(defined(ERROR_REPORTING_MODE) && !defined(BESSEL_IN_FUNCTION_TO_TEST)) | |
74 | typedef Real value_type; | |
75 | ||
76 | typedef value_type (*pg)(value_type, value_type); | |
77 | #if defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) | |
78 | pg funcp = cyl_bessel_i_int_wrapper<value_type>; | |
79 | #else | |
80 | pg funcp = cyl_bessel_i_int_wrapper; | |
81 | #endif | |
82 | ||
83 | boost::math::tools::test_result<value_type> result; | |
84 | ||
85 | std::cout << "Testing " << test_name << " with type " << type_name | |
86 | << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; | |
87 | ||
88 | // | |
89 | // test cyl_bessel_i against data: | |
90 | // | |
91 | result = boost::math::tools::test_hetero<Real>( | |
92 | data, | |
93 | bind_func<Real>(funcp, 0, 1), | |
94 | extract_result<Real>(2)); | |
95 | handle_test_result(result, data[result.worst()], result.worst(), type_name, "cyl_bessel_i (integer orders)", test_name); | |
96 | std::cout << std::endl; | |
97 | #endif | |
98 | } | |
99 | ||
100 | template <class T> | |
101 | void test_bessel(T, const char* name) | |
102 | { | |
103 | // function values calculated on http://functions.wolfram.com/ | |
104 | static const boost::array<boost::array<typename table_type<T>::type, 3>, 10> i0_data = {{ | |
105 | {{ SC_(0.0), SC_(0.0), SC_(1.0) }}, | |
106 | {{ SC_(0.0), SC_(1.0), SC_(1.26606587775200833559824462521471753760767031135496220680814) }}, | |
107 | {{ SC_(0.0), SC_(-2.0), SC_(2.27958530233606726743720444081153335328584110278545905407084) }}, | |
108 | {{ SC_(0.0), SC_(4.0), SC_(11.3019219521363304963562701832171024974126165944353377060065) }}, | |
109 | {{ SC_(0.0), SC_(-7.0), SC_(168.593908510289698857326627187500840376522679234531714193194) }}, | |
110 | {{ SC_(0.0), SC_(0.0009765625), SC_(1.00000023841859331241759166109699567801556273303717896447683) }}, | |
111 | {{ SC_(0.0), SC_(9.5367431640625e-7), SC_(1.00000000000022737367544324498417583090700894607432256476338) }}, | |
112 | {{ SC_(0.0), SC_(-1.0), SC_(1.26606587775200833559824462521471753760767031135496220680814) }}, | |
113 | {{ SC_(0.0), SC_(100.0), SC_(1.07375170713107382351972085760349466128840319332527279540154e42) }}, | |
114 | {{ SC_(0.0), SC_(200.0), SC_(2.03968717340972461954167312677945962233267573614834337894328e85) }}, | |
115 | }}; | |
116 | static const boost::array<boost::array<typename table_type<T>::type, 3>, 10> i1_data = {{ | |
117 | {{ SC_(1.0), SC_(0.0), SC_(0.0) }}, | |
118 | {{ SC_(1.0), SC_(1.0), SC_(0.565159103992485027207696027609863307328899621621092009480294) }}, | |
119 | {{ SC_(1.0), SC_(-2.0), SC_(-1.59063685463732906338225442499966624795447815949553664713229) }}, | |
120 | {{ SC_(1.0), SC_(4.0), SC_(9.75946515370444990947519256731268090005597033325296730692753) }}, | |
121 | {{ SC_(1.0), SC_(-8.0), SC_(-399.873136782560098219083086145822754889628443904067647306574) }}, | |
122 | {{ SC_(1.0), SC_(0.0009765625), SC_(0.000488281308207663226432087816784315537514225208473395063575150) }}, | |
123 | {{ SC_(1.0), SC_(9.5367431640625e-7), SC_(4.76837158203179210108624277276025646653133998635956784292029E-7) }}, | |
124 | {{ SC_(1.0), SC_(-10.0), SC_(-2670.98830370125465434103196677215254914574515378753771310849) }}, | |
125 | {{ SC_(1.0), SC_(100.0), SC_(1.06836939033816248120614576322429526544612284405623226965918e42) }}, | |
126 | {{ SC_(1.0), SC_(200.0), SC_(2.03458154933206270342742797713906950389661161681122964159220e85) }}, | |
127 | }}; | |
128 | static const boost::array<boost::array<typename table_type<T>::type, 3>, 11> in_data = {{ | |
129 | {{ SC_(-2.0), SC_(0.0), SC_(0.0) }}, | |
130 | {{ SC_(2.0), SC_(9.5367431640625e-7), SC_(1.13686837721624646204093977095674566928522671779753217215467e-13) }}, | |
131 | {{ SC_(5.0), SC_(10.0), SC_(777.188286403259959907293484802339632852674154572666041953297) }}, | |
132 | {{ SC_(-5.0), SC_(100.0), SC_(9.47009387303558124618275555002161742321578485033007130107740e41) }}, | |
133 | {{ SC_(-5.0), SC_(-1.0), SC_(-0.000271463155956971875181073905153777342383564426758143634974124) }}, | |
134 | {{ SC_(10.0), SC_(20.0), SC_(3.54020020901952109905289138244985607057267103782948493874391e6) }}, | |
135 | {{ SC_(10.0), SC_(-5.0), SC_(0.00458004441917605126118647027872016953192323139337073320016447) }}, | |
136 | {{ SC_(1e+02), SC_(9.0), SC_(2.74306601746058997093587654668959071522869282506446891736820e-93) }}, | |
137 | {{ SC_(1e+02), SC_(80.0), SC_(4.65194832850610205318128191404145885093970505338730540776711e8) }}, | |
138 | {{ SC_(-100.0), SC_(-200.0), SC_(4.35275044972702191438729017441198257508190719030765213981307e74) }}, | |
139 | {{ SC_(10.0), SC_(1e-100), SC_(2.69114445546737213403880070546737213403880070546737213403880e-1010) }}, | |
140 | }}; | |
141 | static const boost::array<boost::array<typename table_type<T>::type, 3>, 10> iv_data = {{ | |
142 | {{ SC_(2.25), SC_(9.5367431640625e-7), SC_(2.34379212133481347189068464680335815256364262507955635911656e-15) }}, | |
143 | {{ SC_(5.5), SC_(3.125), SC_(0.0583514045989371500460946536220735787163510569634133670181210) }}, | |
144 | {{ SC_(-4.9990234375), SC_(2.125), SC_(0.0267920938009571023702933210070984416052633027166975342895062) }}, | |
145 | {{ SC_(-5.5), SC_(10.0), SC_(597.577606961369169607937419869926705730305175364662688426534) }}, | |
146 | {{ SC_(-5.5), SC_(100.0), SC_(9.22362906144706871737354069133813819358704200689067071415379e41) }}, | |
147 | {{ SC_(-10.0002994537353515625), SC_(0.0009765625), SC_(1.41474005665181350367684623930576333542989766867888186478185e35) }}, | |
148 | {{ SC_(-10.0002994537353515625), SC_(50.0), SC_(1.07153277202900671531087024688681954238311679648319534644743e20) }}, | |
149 | {{ SC_(141.400390625), SC_(100.0), SC_(2066.27694757392660413922181531984160871678224178890247540320) }}, | |
150 | {{ SC_(141.400390625), SC_(200.0), SC_(2.23699739472246928794922868978337381373643889659337595319774e64) }}, | |
151 | {{ SC_(-141.400390625), SC_(100.0), SC_(2066.27694672763190927440969155740243346136463461655104698748) }}, | |
152 | }}; | |
153 | static const boost::array<boost::array<typename table_type<T>::type, 3>, 5> iv_large_data = {{ | |
154 | // Bug report https://svn.boost.org/trac/boost/ticket/5560: | |
155 | {{ SC_(-1.0), SC_(3.7291703656001033716454826577314669186882357673002034471357591666031391925350591524680874452002139016807558e-155), SC_(1.86458518280005168582274132886573345934411788365010172356788e-155) }}, | |
156 | {{ SC_(1.0), SC_(3.7291703656001033716454826577314669186882357673002034471357591666031391925350591524680874452002139016807558e-155), SC_(1.86458518280005168582274132886573345934411788365010172356788e-155) }}, | |
157 | {{ SC_(-1.125), SC_(3.7291703656001033716454826577314669186882357673002034471357591666031391925350591524680874452002139016807558e-155), SC_(-1.34963720853101363690381585556234820027343435206156667634081e173) }}, | |
158 | {{ SC_(1.125), SC_(3.7291703656001033716454826577314669186882357673002034471357591666031391925350591524680874452002139016807558e-155), SC_(8.02269390325932403421158766283366891170783955777638875887348e-175) }}, | |
159 | {{ SC_(0.5), SC_(1.2458993688871959419388378518880931736878259938089494331010226962863582408064841833232475731084062642684629e-206), SC_(8.90597649117647254543282704099383321071493400182381039079219e-104) }}, | |
160 | }}; | |
161 | ||
162 | do_test_cyl_bessel_i<T>(i0_data, name, "Bessel I0: Mathworld Data"); | |
163 | do_test_cyl_bessel_i<T>(i1_data, name, "Bessel I1: Mathworld Data"); | |
164 | do_test_cyl_bessel_i<T>(in_data, name, "Bessel In: Mathworld Data"); | |
165 | ||
166 | do_test_cyl_bessel_i_int<T>(i0_data, name, "Bessel I0: Mathworld Data (Integer Version)"); | |
167 | do_test_cyl_bessel_i_int<T>(i1_data, name, "Bessel I1: Mathworld Data (Integer Version)"); | |
168 | do_test_cyl_bessel_i_int<T>(in_data, name, "Bessel In: Mathworld Data (Integer Version)"); | |
169 | ||
170 | do_test_cyl_bessel_i<T>(iv_data, name, "Bessel Iv: Mathworld Data"); | |
171 | ||
172 | #include "bessel_i_int_data.ipp" | |
173 | do_test_cyl_bessel_i<T>(bessel_i_int_data, name, "Bessel In: Random Data"); | |
174 | #include "bessel_i_data.ipp" | |
175 | do_test_cyl_bessel_i<T>(bessel_i_data, name, "Bessel Iv: Random Data"); | |
176 | ||
177 | if(0 != static_cast<T>(ldexp(0.5, -700))) | |
178 | do_test_cyl_bessel_i<T>(iv_large_data, name, "Bessel Iv: Mathworld Data (large values)"); | |
179 | } | |
180 |