• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
6 #include <boost/multiprecision/cpp_int.hpp>
7 #include <boost/multiprecision/cpp_dec_float.hpp>
8 #include <boost/multiprecision/cpp_bin_float.hpp>
9 
rationalfromStr(const char * str)10 boost::multiprecision::cpp_rational rationalfromStr(const char* str)
11 {
12    boost::multiprecision::cpp_dec_float_50 d1(str);
13    boost::multiprecision::cpp_rational     result(d1); // <--- eats CPU forever
14    return result;
15 }
16 
rationalfromStr2(const char * str)17 boost::multiprecision::cpp_rational rationalfromStr2(const char* str)
18 {
19    boost::multiprecision::cpp_bin_float_50 d1(str);
20    boost::multiprecision::cpp_rational     result(d1); // <--- eats CPU forever
21    return result;
22 }
23 
main()24 int main()
25 {
26    // This example is OK.
27    {
28       boost::multiprecision::cpp_rational expected = 1;
29       BOOST_ASSERT(expected == rationalfromStr("1"));
30    }
31    // This example is OK.
32    {
33       boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(25) / boost::multiprecision::cpp_rational(10);
34       BOOST_ASSERT(expected == rationalfromStr("2.5"));
35    }
36    // This example is OK.
37    {
38       boost::multiprecision::cpp_rational expected = boost::multiprecision::cpp_rational(5) / boost::multiprecision::cpp_rational(1000);
39       BOOST_ASSERT(expected == rationalfromStr("0.005"));
40    }
41    // This example is OK.
42    {
43       boost::multiprecision::cpp_rational expected = 0;
44       BOOST_ASSERT(expected == boost::multiprecision::cpp_rational("0")); // direct cpp_rational from str is OK.
45    }
46    // This example fails.
47    {
48       boost::multiprecision::cpp_rational expected = 0;
49       // reachable code
50       BOOST_ASSERT(expected == rationalfromStr("0")); // cpp_rational from cpp_dec_float_50 is not OK.
51             // unreachable code
52    }
53    {
54       boost::multiprecision::cpp_rational expected = 0;
55       // reacheble code
56       BOOST_ASSERT(expected == rationalfromStr2("0")); // cpp_rational from cpp_dec_float_50 is not OK.
57           // unreachable code
58    }
59    return 0;
60 }
61