test_asin.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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>, 6> exact_data =
  61. {{
  62. {{0.5, static_cast<T>("0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775")}},
  63. {{0.25, static_cast<T>("0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566")}},
  64. {{0.75, static_cast<T>("0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834")}},
  65. {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7")}},
  66. {{1 - std::ldexp(1.0, -20), static_cast<T>("1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728")}},
  67. {{1, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064")}},
  68. }};
  69. unsigned max_err = 0;
  70. for (unsigned k = 0; k < exact_data.size(); k++)
  71. {
  72. T val = asin(exact_data[k][0]);
  73. T e = relative_error(val, exact_data[k][1]);
  74. unsigned err = e.template convert_to<unsigned>();
  75. if (err > max_err)
  76. max_err = err;
  77. val = asin(-exact_data[k][0]);
  78. e = relative_error(val, T(-exact_data[k][1]));
  79. err = e.template convert_to<unsigned>();
  80. if (err > max_err)
  81. {
  82. max_err = err;
  83. }
  84. }
  85. std::cout << "Max error was: " << max_err << std::endl;
  86. BOOST_TEST(max_err < 20);
  87. BOOST_TEST(asin(T(0)) == 0);
  88. }
  89. int main()
  90. {
  91. #ifdef TEST_BACKEND
  92. test<boost::multiprecision::number<boost::multiprecision::concepts::number_backend_float_architype> >();
  93. #endif
  94. #ifdef TEST_MPF_50
  95. test<boost::multiprecision::mpf_float_50>();
  96. test<boost::multiprecision::mpf_float_100>();
  97. #endif
  98. #ifdef TEST_MPFR_50
  99. test<boost::multiprecision::mpfr_float_50>();
  100. test<boost::multiprecision::mpfr_float_100>();
  101. #endif
  102. #ifdef TEST_MPFI_50
  103. test<boost::multiprecision::mpfi_float_50>();
  104. test<boost::multiprecision::mpfi_float_100>();
  105. #endif
  106. #ifdef TEST_CPP_DEC_FLOAT
  107. test<boost::multiprecision::cpp_dec_float_50>();
  108. test<boost::multiprecision::cpp_dec_float_100>();
  109. #ifndef SLOW_COMPLER
  110. // Some "peculiar" digit counts which stress our code:
  111. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<65> > >();
  112. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<64> > >();
  113. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<63> > >();
  114. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<62> > >();
  115. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<61, long long> > >();
  116. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<60, long long> > >();
  117. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<59, long long, std::allocator<char> > > >();
  118. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<58, long long, std::allocator<char> > > >();
  119. // Check low multiprecision digit counts.
  120. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<9> > >();
  121. test<boost::multiprecision::number<boost::multiprecision::cpp_dec_float<18> > >();
  122. #endif
  123. #endif
  124. #ifdef TEST_FLOAT128
  125. test<boost::multiprecision::float128>();
  126. #endif
  127. #ifdef TEST_CPP_BIN_FLOAT
  128. test<boost::multiprecision::cpp_bin_float_50>();
  129. test<boost::multiprecision::number<boost::multiprecision::cpp_bin_float<35, boost::multiprecision::digit_base_10, std::allocator<char>, boost::long_long_type> > >();
  130. #endif
  131. return boost::report_errors();
  132. }