]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/multiprecision/test/issue_13301.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / multiprecision / test / issue_13301.cpp
CommitLineData
11fdf7f2
TL
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
11fdf7f2
TL
6#include <boost/multiprecision/cpp_bin_float.hpp>
7
8int main()
9{
10 typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<8, boost::multiprecision::backends::digit_base_2> > quarter_float;
11
12 quarter_float qf(256);
13
14 unsigned int ui = qf.convert_to<unsigned int>();
15 if (ui != 256)
16 return 1;
17
18 boost::uintmax_t m(1), n;
19 m <<= std::numeric_limits<boost::uintmax_t>::digits - 1;
20 qf = m;
92f5a8d4 21 n = qf.convert_to<boost::uintmax_t>();
11fdf7f2
TL
22 if (m != n)
23 return 2;
24 qf *= 2;
25 n = qf.convert_to<boost::uintmax_t>();
26 m = (std::numeric_limits<boost::uintmax_t>::max)();
27 if (m != n)
28 return 3;
29
92f5a8d4 30 qf = 256;
11fdf7f2
TL
31 int si = qf.convert_to<int>();
32 if (si != 256)
33 return 4;
34 boost::intmax_t sm(1), sn;
35 sm <<= std::numeric_limits<boost::intmax_t>::digits - 1;
36 qf = sm;
37 sn = qf.convert_to<boost::intmax_t>();
38 if (sm != sn)
39 return 5;
40 qf *= 2;
41 sn = qf.convert_to<boost::intmax_t>();
42 sm = (std::numeric_limits<boost::intmax_t>::max)();
43 if (sm != sn)
44 return 6;
45
46 // Again with negative numbers:
47 qf = -256;
48 si = qf.convert_to<int>();
49 if (si != -256)
50 return 7;
51 sm = 1;
52 sm <<= std::numeric_limits<boost::intmax_t>::digits - 1;
53 sm = -sm;
54 qf = sm;
55 sn = qf.convert_to<boost::intmax_t>();
56 if (sm != sn)
57 return 8;
58 qf *= 2;
59 sn = qf.convert_to<boost::intmax_t>();
60 sm = (std::numeric_limits<boost::intmax_t>::min)();
61 if (sm != sn)
62 return 9;
63
64 // Now try conversion to cpp_int:
92f5a8d4 65 qf = 256;
11fdf7f2
TL
66 boost::multiprecision::cpp_int i = qf.convert_to<boost::multiprecision::cpp_int>(), j;
67 if (i != 256)
68 return 10;
69 qf = ldexp(qf, 126);
92f5a8d4
TL
70 i = qf.convert_to<boost::multiprecision::cpp_int>();
71 j = 256;
11fdf7f2
TL
72 j <<= 126;
73 if (i != j)
74 return 11;
75
76 return 0;
77}