]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/multiprecision/test/test_asin.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / multiprecision / test / test_asin.cpp
CommitLineData
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
59template <class T>
60void 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>, 6> exact_data =
92f5a8d4
TL
68 {{
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")}},
75 }};
7c673cae 76 unsigned max_err = 0;
92f5a8d4 77 for (unsigned k = 0; k < exact_data.size(); k++)
7c673cae 78 {
92f5a8d4
TL
79 T val = asin(exact_data[k][0]);
80 T e = relative_error(val, exact_data[k][1]);
7c673cae 81 unsigned err = e.template convert_to<unsigned>();
92f5a8d4 82 if (err > max_err)
7c673cae
FG
83 max_err = err;
84 val = asin(-exact_data[k][0]);
92f5a8d4 85 e = relative_error(val, T(-exact_data[k][1]));
7c673cae 86 err = e.template convert_to<unsigned>();
92f5a8d4 87 if (err > max_err)
7c673cae
FG
88 {
89 max_err = err;
90 }
91 }
92 std::cout << "Max error was: " << max_err << std::endl;
93 BOOST_TEST(max_err < 20);
94 BOOST_TEST(asin(T(0)) == 0);
95}
96
7c673cae
FG
97int main()
98{
99#ifdef TEST_BACKEND
100 test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();
101#endif
102#ifdef TEST_MPF_50
103 test<boost::multiprecision::mpf_float_50>();
104 test<boost::multiprecision::mpf_float_100>();
105#endif
106#ifdef TEST_MPFR_50
107 test<boost::multiprecision::mpfr_float_50>();
108 test<boost::multiprecision::mpfr_float_100>();
109#endif
110#ifdef TEST_MPFI_50
111 test<boost::multiprecision::mpfi_float_50>();
112 test<boost::multiprecision::mpfi_float_100>();
113#endif
114#ifdef TEST_CPP_DEC_FLOAT
115 test<boost::multiprecision::cpp_dec_float_50>();
116 test<boost::multiprecision::cpp_dec_float_100>();
117#ifndef SLOW_COMPLER
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> > >();
11fdf7f2
TL
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> > > >();
7c673cae
FG
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> > >();
130#endif
131#endif
132#ifdef TEST_FLOAT128
133 test<boost::multiprecision::float128>();
134#endif
135#ifdef TEST_CPP_BIN_FLOAT
136 test<boost::multiprecision::cpp_bin_float_50>();
1e59de90 137 test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, long long> > >();
7c673cae
FG
138#endif
139 return boost::report_errors();
140}