summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/multiprecision/test/issue_13301.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/multiprecision/test/issue_13301.cpp')
-rw-r--r--src/boost/libs/multiprecision/test/issue_13301.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/boost/libs/multiprecision/test/issue_13301.cpp b/src/boost/libs/multiprecision/test/issue_13301.cpp
new file mode 100644
index 00000000..f2192d0e
--- /dev/null
+++ b/src/boost/libs/multiprecision/test/issue_13301.cpp
@@ -0,0 +1,77 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_bin_float.hpp>
+
+int main()
+{
+ typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<8, boost::multiprecision::backends::digit_base_2> > quarter_float;
+
+ quarter_float qf(256);
+
+ unsigned int ui = qf.convert_to<unsigned int>();
+ if (ui != 256)
+ return 1;
+
+ boost::uintmax_t m(1), n;
+ m <<= std::numeric_limits<boost::uintmax_t>::digits - 1;
+ qf = m;
+ n = qf.convert_to<boost::uintmax_t>();
+ if (m != n)
+ return 2;
+ qf *= 2;
+ n = qf.convert_to<boost::uintmax_t>();
+ m = (std::numeric_limits<boost::uintmax_t>::max)();
+ if (m != n)
+ return 3;
+
+ qf = 256;
+ int si = qf.convert_to<int>();
+ if (si != 256)
+ return 4;
+ boost::intmax_t sm(1), sn;
+ sm <<= std::numeric_limits<boost::intmax_t>::digits - 1;
+ qf = sm;
+ sn = qf.convert_to<boost::intmax_t>();
+ if (sm != sn)
+ return 5;
+ qf *= 2;
+ sn = qf.convert_to<boost::intmax_t>();
+ sm = (std::numeric_limits<boost::intmax_t>::max)();
+ if (sm != sn)
+ return 6;
+
+ // Again with negative numbers:
+ qf = -256;
+ si = qf.convert_to<int>();
+ if (si != -256)
+ return 7;
+ sm = 1;
+ sm <<= std::numeric_limits<boost::intmax_t>::digits - 1;
+ sm = -sm;
+ qf = sm;
+ sn = qf.convert_to<boost::intmax_t>();
+ if (sm != sn)
+ return 8;
+ qf *= 2;
+ sn = qf.convert_to<boost::intmax_t>();
+ sm = (std::numeric_limits<boost::intmax_t>::min)();
+ if (sm != sn)
+ return 9;
+
+ // Now try conversion to cpp_int:
+ qf = 256;
+ boost::multiprecision::cpp_int i = qf.convert_to<boost::multiprecision::cpp_int>(), j;
+ if (i != 256)
+ return 10;
+ qf = ldexp(qf, 126);
+ i = qf.convert_to<boost::multiprecision::cpp_int>();
+ j = 256;
+ j <<= 126;
+ if (i != j)
+ return 11;
+
+ return 0;
+}