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)10boost::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)17boost::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()24int 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