]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/bug12039.cpp
173570dfe87201c6038bcd0e2bf59d6092aa17db
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)
6 #include <boost/multiprecision/cpp_bin_float.hpp>
10 typedef boost::multiprecision::number
<boost::multiprecision::backends::cpp_bin_float
<256> > ext_float_t
;
11 typedef boost::multiprecision::number
<boost::multiprecision::backends::cpp_bin_float
<2046> > long_ext_float_t
;
15 ext_float_t x1
= x
+ 255.0 / (1 << 20); // + 2^-12 - eps
16 ext_float_t x2
= x
+ 257.0 / (1 << 20); // + 2^-12 + eps
17 double d1
= x1
.convert_to
<double>();
18 double d2
= x2
.convert_to
<double>();
20 std::cout
<< std::setprecision(18) << d1
<< std::endl
;
21 std::cout
<< std::setprecision(18) << d2
<< std::endl
;
24 x1
= x
+ ldexp(255.0, -38); // + 2^-30 - eps
25 x2
= x
+ ldexp(257.0, -38); // + 2^-30 + eps
26 float f1
= x1
.convert_to
<float>();
27 float f2
= x2
.convert_to
<float>();
29 std::cout
<< std::setprecision(9) << f1
<< std::endl
;
30 std::cout
<< std::setprecision(9) << f2
<< std::endl
;
32 long_ext_float_t
lf(1);
33 lf
+= std::numeric_limits
<long_ext_float_t
>::epsilon();
34 lf
+= std::numeric_limits
<float>::epsilon() / 2;
35 BOOST_ASSERT(lf
!= 1);
36 float f3
= lf
.convert_to
<float>();
37 std::cout
<< std::setprecision(9) << f3
<< std::endl
;
39 return (d1
== d2
) && (f1
== f2
) && (f3
!= 1) ? 0 : 1;