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
5 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
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
12 #define _SCL_SECURE_NO_WARNINGS
15 #include <boost/detail/lightweight_test.hpp>
16 #include <boost/array.hpp>
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)
23 #define TEST_CPP_DEC_FLOAT
26 #define TEST_CPP_BIN_FLOAT
29 #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
32 #pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
37 #if defined(TEST_MPF_50)
38 #include <boost/multiprecision/gmp.hpp>
40 #if defined(TEST_MPFR_50)
41 #include <boost/multiprecision/mpfr.hpp>
43 #if defined(TEST_MPFI_50)
44 #include <boost/multiprecision/mpfi.hpp>
47 #include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
49 #ifdef TEST_CPP_DEC_FLOAT
50 #include <boost/multiprecision/cpp_dec_float.hpp>
53 #include <boost/multiprecision/float128.hpp>
55 #ifdef TEST_CPP_BIN_FLOAT
56 #include <boost/multiprecision/cpp_bin_float.hpp>
62 std::cout
<< "Testing type: " << typeid(T
).name() << std::endl
;
64 // Test with some exact binary values as input - this tests our code
65 // rather than the test data:
67 static const boost::array
<boost::array
<T
, 2>, 6> exact_data
=
69 {{0.5, static_cast<T
>("0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775")}},
70 {{0.25, static_cast<T
>("0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566")}},
71 {{0.75, static_cast<T
>("0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834")}},
72 {{std::ldexp(1.0, -20), static_cast<T
>("9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7")}},
73 {{1 - std::ldexp(1.0, -20), static_cast<T
>("1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728")}},
74 {{1, static_cast<T
>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064")}},
77 for (unsigned k
= 0; k
< exact_data
.size(); k
++)
79 T val
= asin(exact_data
[k
][0]);
80 T e
= relative_error(val
, exact_data
[k
][1]);
81 unsigned err
= e
.template convert_to
<unsigned>();
84 val
= asin(-exact_data
[k
][0]);
85 e
= relative_error(val
, T(-exact_data
[k
][1]));
86 err
= e
.template convert_to
<unsigned>();
92 std::cout
<< "Max error was: " << max_err
<< std::endl
;
93 BOOST_TEST(max_err
< 20);
94 BOOST_TEST(asin(T(0)) == 0);
100 test
<boost::multiprecision::number
<boost::multiprecision::concepts::number_backend_float_architype
> >();
103 test
<boost::multiprecision::mpf_float_50
>();
104 test
<boost::multiprecision::mpf_float_100
>();
107 test
<boost::multiprecision::mpfr_float_50
>();
108 test
<boost::multiprecision::mpfr_float_100
>();
111 test
<boost::multiprecision::mpfi_float_50
>();
112 test
<boost::multiprecision::mpfi_float_100
>();
114 #ifdef TEST_CPP_DEC_FLOAT
115 test
<boost::multiprecision::cpp_dec_float_50
>();
116 test
<boost::multiprecision::cpp_dec_float_100
>();
118 // Some "peculiar" digit counts which stress our code:
119 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<65> > >();
120 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<64> > >();
121 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<63> > >();
122 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<62> > >();
123 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<61, long long> > >();
124 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<60, long long> > >();
125 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<59, long long, std::allocator
<char> > > >();
126 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<58, long long, std::allocator
<char> > > >();
127 // Check low multiprecision digit counts.
128 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<9> > >();
129 test
<boost::multiprecision::number
<boost::multiprecision::cpp_dec_float
<18> > >();
133 test
<boost::multiprecision::float128
>();
135 #ifdef TEST_CPP_BIN_FLOAT
136 test
<boost::multiprecision::cpp_bin_float_50
>();
137 test
<boost::multiprecision::number
<boost::multiprecision::cpp_bin_float
<35, boost::multiprecision::digit_base_10
, std::allocator
<char>, long long> > >();
139 return boost::report_errors();