• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015-2018 Hans Dembinski
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/histogram/accumulators/ostream.hpp>
9 #include <boost/histogram/accumulators/sum.hpp>
10 #include "throw_exception.hpp"
11 #include "utility_str.hpp"
12 
13 using namespace boost::histogram;
14 using namespace std::literals;
15 
main()16 int main() {
17   double bad_sum = 0;
18   bad_sum += 1;
19   bad_sum += 1e100;
20   bad_sum += 1;
21   bad_sum += -1e100;
22   BOOST_TEST_EQ(bad_sum, 0); // instead of 2
23 
24   using s_t = accumulators::sum<double>;
25   s_t sum;
26   ++sum;
27   BOOST_TEST_EQ(sum, 1);
28   BOOST_TEST_EQ(sum.value(), 1);
29   BOOST_TEST_EQ(sum.large(), 1);
30   BOOST_TEST_EQ(sum.small(), 0);
31   BOOST_TEST_EQ(str(sum), "sum(1 + 0)"s);
32   BOOST_TEST_EQ(str(sum, 15, false), "     sum(1 + 0)"s);
33   BOOST_TEST_EQ(str(sum, 15, true), "sum(1 + 0)     "s);
34 
35   sum += 1e100;
36   BOOST_TEST_EQ(sum, (s_t{1e100, 1}));
37   ++sum;
38   BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
39   sum += -1e100;
40   BOOST_TEST_EQ(sum, (s_t{0, 2}));
41   BOOST_TEST_EQ(sum, 2); // correct answer
42   BOOST_TEST_EQ(sum.value(), 2);
43   BOOST_TEST_EQ(sum.large(), 0);
44   BOOST_TEST_EQ(sum.small(), 2);
45 
46   sum = s_t{1e100, 1};
47   sum += s_t{1e100, 1};
48   BOOST_TEST_EQ(sum, (s_t{2e100, 2}));
49   sum = s_t{1e100, 1};
50   sum += s_t{1, 0};
51   BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
52   sum = s_t{1, 0};
53   sum += s_t{1e100, 1};
54   BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
55   sum = s_t{0, 1};
56   sum += s_t{1, 0};
57   BOOST_TEST_EQ(sum, (s_t{1, 1}));
58 
59   accumulators::sum<double> a{3}, b{2}, c{3};
60   BOOST_TEST_LT(b, c);
61   BOOST_TEST_LE(b, c);
62   BOOST_TEST_LE(a, c);
63   BOOST_TEST_GT(a, b);
64   BOOST_TEST_GE(a, b);
65   BOOST_TEST_GE(a, c);
66 
67   BOOST_TEST_EQ(s_t{} += s_t{}, s_t{});
68 
69   return boost::report_errors();
70 }
71