Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / multiprecision / test / issue_13148.cpp
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
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
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
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 }