summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/multiprecision/test/test_asin.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/multiprecision/test/test_asin.cpp
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/multiprecision/test/test_asin.cpp')
-rw-r--r--src/boost/libs/multiprecision/test/test_asin.cpp140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/boost/libs/multiprecision/test/test_asin.cpp b/src/boost/libs/multiprecision/test/test_asin.cpp
new file mode 100644
index 00000000..fc817dce
--- /dev/null
+++ b/src/boost/libs/multiprecision/test/test_asin.cpp
@@ -0,0 +1,140 @@
+///////////////////////////////////////////////////////////////
+// Copyright Christopher Kormanyos 2002 - 2011.
+// Copyright 2011 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
+//
+// This work is based on an earlier work:
+// "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
+// in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
+
+#ifdef _MSC_VER
+#define _SCL_SECURE_NO_WARNINGS
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+#include "test.hpp"
+
+#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)
+#define TEST_MPF_50
+//# define TEST_MPF
+#define TEST_BACKEND
+#define TEST_CPP_DEC_FLOAT
+#define TEST_MPFI_50
+#define TEST_FLOAT128
+#define TEST_CPP_BIN_FLOAT
+
+#ifdef _MSC_VER
+#pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
+#endif
+#ifdef __GNUC__
+#pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
+#endif
+
+#endif
+
+#if defined(TEST_MPF_50)
+#include <boost/multiprecision/gmp.hpp>
+#endif
+#if defined(TEST_MPFR_50)
+#include <boost/multiprecision/mpfr.hpp>
+#endif
+#if defined(TEST_MPFI_50)
+#include <boost/multiprecision/mpfi.hpp>
+#endif
+#ifdef TEST_BACKEND
+#include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#endif
+#ifdef TEST_FLOAT128
+#include <boost/multiprecision/float128.hpp>
+#endif
+#ifdef TEST_CPP_BIN_FLOAT
+#include <boost/multiprecision/cpp_bin_float.hpp>
+#endif
+
+template <class T>
+void test()
+{
+ std::cout << "Testing type: " << typeid(T).name() << std::endl;
+ //
+ // Test with some exact binary values as input - this tests our code
+ // rather than the test data:
+ //
+ static const boost::array<boost::array<T, 2>, 6> exact_data =
+ {{
+ {{0.5, static_cast<T>("0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775")}},
+ {{0.25, static_cast<T>("0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566")}},
+ {{0.75, static_cast<T>("0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834")}},
+ {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7")}},
+ {{1 - std::ldexp(1.0, -20), static_cast<T>("1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728")}},
+ {{1, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064")}},
+ }};
+ unsigned max_err = 0;
+ for (unsigned k = 0; k < exact_data.size(); k++)
+ {
+ T val = asin(exact_data[k][0]);
+ T e = relative_error(val, exact_data[k][1]);
+ unsigned err = e.template convert_to<unsigned>();
+ if (err > max_err)
+ max_err = err;
+ val = asin(-exact_data[k][0]);
+ e = relative_error(val, T(-exact_data[k][1]));
+ err = e.template convert_to<unsigned>();
+ if (err > max_err)
+ {
+ max_err = err;
+ }
+ }
+ std::cout << "Max error was: " << max_err << std::endl;
+ BOOST_TEST(max_err < 20);
+ BOOST_TEST(asin(T(0)) == 0);
+}
+
+int main()
+{
+#ifdef TEST_BACKEND
+ test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();
+#endif
+#ifdef TEST_MPF_50
+ test<boost::multiprecision::mpf_float_50>();
+ test<boost::multiprecision::mpf_float_100>();
+#endif
+#ifdef TEST_MPFR_50
+ test<boost::multiprecision::mpfr_float_50>();
+ test<boost::multiprecision::mpfr_float_100>();
+#endif
+#ifdef TEST_MPFI_50
+ test<boost::multiprecision::mpfi_float_50>();
+ test<boost::multiprecision::mpfi_float_100>();
+#endif
+#ifdef TEST_CPP_DEC_FLOAT
+ test<boost::multiprecision::cpp_dec_float_50>();
+ test<boost::multiprecision::cpp_dec_float_100>();
+#ifndef SLOW_COMPLER
+ // Some "peculiar" digit counts which stress our code:
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();
+ // Check low multiprecision digit counts.
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();
+#endif
+#endif
+#ifdef TEST_FLOAT128
+ test<boost::multiprecision::float128>();
+#endif
+#ifdef TEST_CPP_BIN_FLOAT
+ test<boost::multiprecision::cpp_bin_float_50>();
+ test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >();
+#endif
+ return boost::report_errors();
+}