]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /////////////////////////////////////////////////////////////// |
2 | // Copyright Christopher Kormanyos 2002 - 2011. | |
3 | // Copyright 2011 John Maddock. Distributed under the Boost | |
4 | // Software License, Version 1.0. (See accompanying file | |
92f5a8d4 | 5 | // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt |
7c673cae FG |
6 | // |
7 | // This work is based on an earlier work: | |
8 | // "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations", | |
9 | // in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 | |
10 | ||
11 | #ifdef _MSC_VER | |
92f5a8d4 | 12 | #define _SCL_SECURE_NO_WARNINGS |
7c673cae FG |
13 | #endif |
14 | ||
15 | #include <boost/detail/lightweight_test.hpp> | |
16 | #include <boost/array.hpp> | |
17 | #include "test.hpp" | |
18 | ||
19 | #if !defined(TEST_MPF_50) && !defined(TEST_MPF) && !defined(TEST_BACKEND) && !defined(TEST_CPP_DEC_FLOAT) && !defined(TEST_MPFR) && !defined(TEST_MPFR_50) && !defined(TEST_MPFI_50) && !defined(TEST_FLOAT128) && !defined(TEST_CPP_BIN_FLOAT) | |
92f5a8d4 | 20 | #define TEST_MPF_50 |
7c673cae | 21 | //# define TEST_MPF |
92f5a8d4 TL |
22 | #define TEST_BACKEND |
23 | #define TEST_CPP_DEC_FLOAT | |
24 | #define TEST_MPFI_50 | |
25 | #define TEST_FLOAT128 | |
26 | #define TEST_CPP_BIN_FLOAT | |
7c673cae FG |
27 | |
28 | #ifdef _MSC_VER | |
29 | #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!") | |
30 | #endif | |
31 | #ifdef __GNUC__ | |
32 | #pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!" | |
33 | #endif | |
34 | ||
35 | #endif | |
36 | ||
37 | #if defined(TEST_MPF_50) | |
38 | #include <boost/multiprecision/gmp.hpp> | |
39 | #endif | |
40 | #if defined(TEST_MPFR_50) | |
41 | #include <boost/multiprecision/mpfr.hpp> | |
42 | #endif | |
43 | #if defined(TEST_MPFI_50) | |
44 | #include <boost/multiprecision/mpfi.hpp> | |
45 | #endif | |
46 | #ifdef TEST_BACKEND | |
47 | #include <boost/multiprecision/concepts/mp_number_archetypes.hpp> | |
48 | #endif | |
49 | #ifdef TEST_CPP_DEC_FLOAT | |
50 | #include <boost/multiprecision/cpp_dec_float.hpp> | |
51 | #endif | |
52 | #ifdef TEST_FLOAT128 | |
53 | #include <boost/multiprecision/float128.hpp> | |
54 | #endif | |
55 | #ifdef TEST_CPP_BIN_FLOAT | |
56 | #include <boost/multiprecision/cpp_bin_float.hpp> | |
57 | #endif | |
58 | ||
59 | template <class T> | |
60 | void test() | |
61 | { | |
62 | std::cout << "Testing type: " << typeid(T).name() << std::endl; | |
63 | // | |
64 | // Test with some exact binary values as input - this tests our code | |
65 | // rather than the test data: | |
66 | // | |
67 | static const boost::array<boost::array<T, 2>, 13> exact_data = | |
92f5a8d4 TL |
68 | {{ |
69 | {{0.5, static_cast<T>("1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555")}}, | |
70 | {{0.25, static_cast<T>("1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676")}}, | |
71 | {{0.75, static_cast<T>("0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490")}}, | |
72 | {{1 - std::ldexp(1.0, -20), static_cast<T>("0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204")}}, | |
73 | {{std::ldexp(1.0, -20), static_cast<T>("1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127")}}, | |
74 | {{1, static_cast<T>("0")}}, | |
7c673cae | 75 | |
92f5a8d4 | 76 | {{0, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332")}}, |
7c673cae | 77 | |
92f5a8d4 TL |
78 | {{-0.5, static_cast<T>("2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110")}}, |
79 | {{-0.25, static_cast<T>("1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989")}}, | |
80 | {{-0.75, static_cast<T>("2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516")}}, | |
81 | {{-1 + std::ldexp(1.0, -20), static_cast<T>("3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061")}}, | |
82 | {{-std::ldexp(1.0, -20), static_cast<T>("1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538")}}, | |
83 | {{-1, static_cast<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665")}}, | |
84 | }}; | |
7c673cae | 85 | unsigned max_err = 0; |
92f5a8d4 | 86 | for (unsigned k = 0; k < exact_data.size(); k++) |
7c673cae | 87 | { |
92f5a8d4 TL |
88 | T val = acos(exact_data[k][0]); |
89 | T e = relative_error(val, exact_data[k][1]); | |
7c673cae | 90 | unsigned err = e.template convert_to<unsigned>(); |
92f5a8d4 | 91 | if (err > max_err) |
7c673cae FG |
92 | { |
93 | max_err = err; | |
94 | } | |
95 | } | |
96 | std::cout << "Max error was: " << max_err << std::endl; | |
97 | #ifdef TEST_CPP_BIN_FLOAT | |
11fdf7f2 | 98 | BOOST_TEST(max_err < 320); |
7c673cae FG |
99 | #else |
100 | BOOST_TEST(max_err < 60); | |
101 | #endif | |
102 | BOOST_TEST(asin(T(0)) == 0); | |
103 | } | |
104 | ||
7c673cae FG |
105 | int main() |
106 | { | |
107 | #ifdef TEST_BACKEND | |
108 | test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >(); | |
109 | #endif | |
110 | #ifdef TEST_MPF_50 | |
111 | test<boost::multiprecision::mpf_float_50>(); | |
112 | test<boost::multiprecision::mpf_float_100>(); | |
113 | #endif | |
114 | #ifdef TEST_MPFR_50 | |
115 | test<boost::multiprecision::mpfr_float_50>(); | |
116 | test<boost::multiprecision::mpfr_float_100>(); | |
117 | #endif | |
118 | #ifdef TEST_MPFI_50 | |
119 | test<boost::multiprecision::mpfi_float_50>(); | |
120 | test<boost::multiprecision::mpfi_float_100>(); | |
121 | #endif | |
122 | #ifdef TEST_CPP_DEC_FLOAT | |
123 | test<boost::multiprecision::cpp_dec_float_50>(); | |
124 | test<boost::multiprecision::cpp_dec_float_100>(); | |
125 | #ifndef SLOW_COMPLER | |
126 | // Some "peculiar" digit counts which stress our code: | |
127 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >(); | |
128 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >(); | |
129 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >(); | |
130 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >(); | |
131 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >(); | |
132 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >(); | |
11fdf7f2 TL |
133 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >(); |
134 | test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >(); | |
7c673cae FG |
135 | #endif |
136 | #endif | |
137 | #ifdef TEST_FLOAT128 | |
138 | test<boost::multiprecision::float128>(); | |
139 | #endif | |
140 | #ifdef TEST_CPP_BIN_FLOAT | |
141 | test<boost::multiprecision::cpp_bin_float_50>(); | |
1e59de90 | 142 | test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >(); |
7c673cae FG |
143 | #endif |
144 | return boost::report_errors(); | |
145 | } |