Ticket #12524: af_p1.cpp

File af_p1.cpp, 1.8 KB (added by Michael Shatz, 6 years ago)

demonstrates non-IEEE sign of zero of cpp_bin_float addition/subtraction

Line 
1#include <iostream>
2#include <boost/multiprecision/cpp_bin_float.hpp>
3
4typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<128, boost::multiprecision::backends::digit_base_2> > boost_quadfloat_t;
5
6int main(int , char** )
7{
8 char opc = '+';
9 for (int op = 0; op < 2; ++op) {
10 double a = 0;
11 for (int i = 0; i < 2; ++i) {
12 double b = 0;
13 for (int k = 0; k < 2; ++k) {
14 double dab = (opc == '+') ? a + b : a - b;
15 boost_quadfloat_t ba = a, bb = b;
16 boost_quadfloat_t bab = (opc == '+') ? ba + bb : ba - bb;
17
18 std::cout
19 << "double: "
20 << std::setw(2) << a << " " << opc << " "
21 << std::setw(2) << b << " => "
22 << std::setw(2) << dab
23 << ";\tcpp_bin_float: "
24 << std::setw(2) << ba << " " << opc << " "
25 << std::setw(2) << bb << " => "
26 << std::setw(2) << bab
27 << "\n"
28 ;
29 b = - b;
30 }
31 a = - a;
32 }
33 opc = '-';
34 }
35
36 std::cout << "\n";
37 opc = '+';
38 for (int op = 0; op < 2; ++op) {
39 double a = 1;
40 for (int i = 0; i < 2; ++i) {
41 double b = (opc == '+') ? -a : a;
42 double dab = (opc == '+') ? a + b : a - b;
43 boost_quadfloat_t ba = a, bb = b;
44 boost_quadfloat_t bab = (opc == '+') ? ba + bb : ba - bb;
45
46 std::cout
47 << "double: "
48 << std::setw(2) << a << " " << opc << " "
49 << std::setw(2) << b << " => "
50 << std::setw(2) << dab
51 << ";\tcpp_bin_float: "
52 << std::setw(2) << ba << " " << opc << " "
53 << std::setw(2) << bb << " => "
54 << std::setw(2) << bab
55 << "\n"
56 ;
57 a = - a;
58 }
59 opc = '-';
60 }
61 return 0;
62}