issue_13148.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright 2016 John Maddock. Distributed under the Boost
  3. // Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/multiprecision/cpp_int.hpp>
  6. #include <boost/multiprecision/cpp_dec_float.hpp>
  7. #include <boost/multiprecision/cpp_bin_float.hpp>
  8. boost::multiprecision::cpp_rational rationalfromStr(const char* str)
  9. {
  10. boost::multiprecision::cpp_dec_float_50 d1(str);
  11. boost::multiprecision::cpp_rational result(d1); // <--- eats CPU forever
  12. return result;
  13. }
  14. boost::multiprecision::cpp_rational rationalfromStr2(const char* str)
  15. {
  16. boost::multiprecision::cpp_bin_float_50 d1(str);
  17. boost::multiprecision::cpp_rational result(d1); // <--- eats CPU forever
  18. return result;
  19. }
  20. int main()
  21. {
  22. // This example is OK.
  23. {
  24. boost::multiprecision::cpp_rational expected = 1;
  25. BOOST_ASSERT(expected == rationalfromStr("1"));
  26. }
  27. // This example is OK.
  28. {
  29. boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(25) / boost::multiprecision::cpp_rational(10);
  30. BOOST_ASSERT(expected == rationalfromStr("2.5"));
  31. }
  32. // This example is OK.
  33. {
  34. boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(5) / boost::multiprecision::cpp_rational(1000);
  35. BOOST_ASSERT(expected == rationalfromStr("0.005"));
  36. }
  37. // This example is OK.
  38. {
  39. boost::multiprecision::cpp_rational expected = 0;
  40. BOOST_ASSERT(expected == boost::multiprecision::cpp_rational("0")); // direct cpp_rational from str is OK.
  41. }
  42. // This example fails.
  43. {
  44. boost::multiprecision::cpp_rational expected = 0;
  45. // reachable code
  46. BOOST_ASSERT(expected == rationalfromStr("0")); // cpp_rational from cpp_dec_float_50 is not OK.
  47. // unreachable code
  48. }
  49. {
  50. boost::multiprecision::cpp_rational expected = 0;
  51. // reacheble code
  52. BOOST_ASSERT(expected == rationalfromStr2("0")); // cpp_rational from cpp_dec_float_50 is not OK.
  53. // unreachable code
  54. }
  55. return 0;
  56. }