test_acos.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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
  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. #ifdef _MSC_VER
  11. #define _SCL_SECURE_NO_WARNINGS
  12. #endif
  13. #include <boost/detail/lightweight_test.hpp>
  14. #include <boost/array.hpp>
  15. #include "test.hpp"
  16. #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)
  17. #define TEST_MPF_50
  18. //# define TEST_MPF
  19. #define TEST_BACKEND
  20. #define TEST_CPP_DEC_FLOAT
  21. #define TEST_MPFI_50
  22. #define TEST_FLOAT128
  23. #define TEST_CPP_BIN_FLOAT
  24. #ifdef _MSC_VER
  25. #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
  26. #endif
  27. #ifdef __GNUC__
  28. #pragma warning "CAUTION!!: No backend type specified so testing everything.... this will take some time!!"
  29. #endif
  30. #endif
  31. #if defined(TEST_MPF_50)
  32. #include <boost/multiprecision/gmp.hpp>
  33. #endif
  34. #if defined(TEST_MPFR_50)
  35. #include <boost/multiprecision/mpfr.hpp>
  36. #endif
  37. #if defined(TEST_MPFI_50)
  38. #include <boost/multiprecision/mpfi.hpp>
  39. #endif
  40. #ifdef TEST_BACKEND
  41. #include <boost/multiprecision/concepts/mp_number_archetypes.hpp>
  42. #endif
  43. #ifdef TEST_CPP_DEC_FLOAT
  44. #include <boost/multiprecision/cpp_dec_float.hpp>
  45. #endif
  46. #ifdef TEST_FLOAT128
  47. #include <boost/multiprecision/float128.hpp>
  48. #endif
  49. #ifdef TEST_CPP_BIN_FLOAT
  50. #include <boost/multiprecision/cpp_bin_float.hpp>
  51. #endif
  52. template <class T>
  53. void test()
  54. {
  55. std::cout << "Testing type: " << typeid(T).name() << std::endl;
  56. //
  57. // Test with some exact binary values as input - this tests our code
  58. // rather than the test data:
  59. //
  60. static const boost::array<boost::array<T, 2>, 13> exact_data =
  61. {{
  62. {{0.5, static_cast<T>("1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555")}},
  63. {{0.25, static_cast<T>("1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676")}},
  64. {{0.75, static_cast<T>("0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490")}},
  65. {{1 - std::ldexp(1.0, -20), static_cast<T>("0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204")}},
  66. {{std::ldexp(1.0, -20), static_cast<T>("1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127")}},
  67. {{1, static_cast<T>("0")}},
  68. {{0, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332")}},
  69. {{-0.5, static_cast<T>("2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110")}},
  70. {{-0.25, static_cast<T>("1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989")}},
  71. {{-0.75, static_cast<T>("2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516")}},
  72. {{-1 + std::ldexp(1.0, -20), static_cast<T>("3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061")}},
  73. {{-std::ldexp(1.0, -20), static_cast<T>("1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538")}},
  74. {{-1, static_cast<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665")}},
  75. }};
  76. unsigned max_err = 0;
  77. for (unsigned k = 0; k < exact_data.size(); k++)
  78. {
  79. T val = acos(exact_data[k][0]);
  80. T e = relative_error(val, exact_data[k][1]);
  81. unsigned err = e.template convert_to<unsigned>();
  82. if (err > max_err)
  83. {
  84. max_err = err;
  85. }
  86. }
  87. std::cout << "Max error was: " << max_err << std::endl;
  88. #ifdef TEST_CPP_BIN_FLOAT
  89. BOOST_TEST(max_err < 320);
  90. #else
  91. BOOST_TEST(max_err < 60);
  92. #endif
  93. BOOST_TEST(asin(T(0)) == 0);
  94. }
  95. int main()
  96. {
  97. #ifdef TEST_BACKEND
  98. test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();
  99. #endif
  100. #ifdef TEST_MPF_50
  101. test<boost::multiprecision::mpf_float_50>();
  102. test<boost::multiprecision::mpf_float_100>();
  103. #endif
  104. #ifdef TEST_MPFR_50
  105. test<boost::multiprecision::mpfr_float_50>();
  106. test<boost::multiprecision::mpfr_float_100>();
  107. #endif
  108. #ifdef TEST_MPFI_50
  109. test<boost::multiprecision::mpfi_float_50>();
  110. test<boost::multiprecision::mpfi_float_100>();
  111. #endif
  112. #ifdef TEST_CPP_DEC_FLOAT
  113. test<boost::multiprecision::cpp_dec_float_50>();
  114. test<boost::multiprecision::cpp_dec_float_100>();
  115. #ifndef SLOW_COMPLER
  116. // Some "peculiar" digit counts which stress our code:
  117. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();
  118. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();
  119. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();
  120. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();
  121. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();
  122. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();
  123. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();
  124. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();
  125. #endif
  126. #endif
  127. #ifdef TEST_FLOAT128
  128. test<boost::multiprecision::float128>();
  129. #endif
  130. #ifdef TEST_CPP_BIN_FLOAT
  131. test<boost::multiprecision::cpp_bin_float_50>();
  132. test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >();
  133. #endif
  134. return boost::report_errors();
  135. }