log1p_expm1_test.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. #include "setup.hpp"
  11. //#include <boost/math/special_functions/log1p.hpp>
  12. //#include <boost/math/special_functions/expm1.hpp>
  13. #define BOOST_TEST_MAIN
  14. #include <boost/test/unit_test.hpp>
  15. #include <boost/test/floating_point_comparison.hpp>
  16. #include <boost/math/special_functions/math_fwd.hpp>
  17. #include "table_type.hpp"
  18. #include "libs/math/test/log1p_expm1_test.hpp"
  19. //
  20. // DESCRIPTION:
  21. // ~~~~~~~~~~~~
  22. //
  23. // This file tests the functions log1p and expm1. The accuracy tests
  24. // use values generated with NTL::RR at 1000-bit precision
  25. // and our generic versions of these functions.
  26. //
  27. // Note that when this file is first run on a new platform many of
  28. // these tests will fail: the default accuracy is 1 epsilon which
  29. // is too tight for most platforms. In this situation you will
  30. // need to cast a human eye over the error rates reported and make
  31. // a judgement as to whether they are acceptable. Either way please
  32. // report the results to the Boost mailing list. Acceptable rates of
  33. // error are marked up below as a series of regular expressions that
  34. // identify the compiler/stdlib/platform/data-type/test-data/test-function
  35. // along with the maximum expected peek and RMS mean errors for that
  36. // test.
  37. //
  38. void expected_results()
  39. {
  40. //
  41. // Define the max and mean errors expected for
  42. // various compilers and platforms.
  43. //
  44. //
  45. // Catch all cases come last:
  46. //
  47. add_expected_result(
  48. ".*", // compiler
  49. ".*", // stdlib
  50. ".*", // platform
  51. ".*gmp_float<18>.*", // test type(s)
  52. ".*", // test data group
  53. ".*", // test function
  54. 500, // Max Peek error
  55. 100); // Max mean error
  56. add_expected_result(
  57. ".*", // compiler
  58. ".*", // stdlib
  59. ".*", // platform
  60. ".*mpfr_float_backend<18>.*", // test type(s)
  61. ".*", // test data group
  62. ".*", // test function
  63. 500, // Max Peek error
  64. 100); // Max mean error
  65. add_expected_result(
  66. ".*", // compiler
  67. ".*", // stdlib
  68. ".*", // platform
  69. ".*", // test type(s)
  70. ".*", // test data group
  71. ".*", // test function
  72. 8, // Max Peek error
  73. 5); // Max mean error
  74. //
  75. // Finish off by printing out the compiler/stdlib/platform names,
  76. // we do this to make it easier to mark up expected error rates.
  77. //
  78. std::cout << "Tests run with " << BOOST_COMPILER << ", "
  79. << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl;
  80. }
  81. BOOST_AUTO_TEST_CASE(test_main)
  82. {
  83. using namespace boost::multiprecision;
  84. expected_results();
  85. //
  86. // Test at:
  87. // 18 decimal digits: tests 80-bit long double approximations
  88. // 30 decimal digits: tests 128-bit long double approximations
  89. // 35 decimal digits: tests arbitrary precision code
  90. //
  91. ALL_TESTS
  92. }