Imported Upstream version 1.57.0
[platform/upstream/boost.git] / libs / multiprecision / test / test_acos.cpp
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 http://www.boost.org/LICENSE_1_
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
12 #  define _SCL_SECURE_NO_WARNINGS
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)
20 #  define TEST_MPF_50
21 //#  define TEST_MPF
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
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 =
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") }},
75
76       {{0, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332") }},
77
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    }};
85    unsigned max_err = 0;
86    for(unsigned k = 0; k < exact_data.size(); k++)
87    {
88       T val = acos(exact_data[k][0]);
89       T e = relative_error(val, exact_data[k][1]);
90       unsigned err = e.template convert_to<unsigned>();
91       if(err > max_err)
92       {
93          max_err = err;
94       }
95    }
96    std::cout << "Max error was: " << max_err << std::endl;
97 #ifdef TEST_CPP_BIN_FLOAT
98    BOOST_TEST(max_err < 120);
99 #else
100    BOOST_TEST(max_err < 60);
101 #endif
102    BOOST_TEST(asin(T(0)) == 0);
103 }
104
105
106 int main()
107 {
108 #ifdef TEST_BACKEND
109    test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();
110 #endif
111 #ifdef TEST_MPF_50
112    test<boost::multiprecision::mpf_float_50>();
113    test<boost::multiprecision::mpf_float_100>();
114 #endif
115 #ifdef TEST_MPFR_50
116    test<boost::multiprecision::mpfr_float_50>();
117    test<boost::multiprecision::mpfr_float_100>();
118 #endif
119 #ifdef TEST_MPFI_50
120    test<boost::multiprecision::mpfi_float_50>();
121    test<boost::multiprecision::mpfi_float_100>();
122 #endif
123 #ifdef TEST_CPP_DEC_FLOAT
124    test<boost::multiprecision::cpp_dec_float_50>();
125    test<boost::multiprecision::cpp_dec_float_100>();
126 #ifndef SLOW_COMPLER
127    // Some "peculiar" digit counts which stress our code:
128    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();
129    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();
130    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();
131    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();
132    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();
133    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();
134    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<void> > > >();
135    test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<void> > > >();
136 #endif
137 #endif
138 #ifdef TEST_FLOAT128
139    test<boost::multiprecision::float128>();
140 #endif
141 #ifdef TEST_CPP_BIN_FLOAT
142    test<boost::multiprecision::cpp_bin_float_50>();
143 #endif
144    return boost::report_errors();
145 }
146
147
148