File: accumulators_sum_test.cpp

package info (click to toggle)
boost1.74 1.74.0%2Bds1-21
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 463,588 kB
  • sloc: cpp: 3,338,117; xml: 131,293; python: 33,088; ansic: 14,292; asm: 4,038; sh: 3,353; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (70 lines) | stat: -rw-r--r-- 1,847 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Copyright 2015-2018 Hans Dembinski
//
// 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/core/lightweight_test.hpp>
#include <boost/histogram/accumulators/ostream.hpp>
#include <boost/histogram/accumulators/sum.hpp>
#include "throw_exception.hpp"
#include "utility_str.hpp"

using namespace boost::histogram;
using namespace std::literals;

int main() {
  double bad_sum = 0;
  bad_sum += 1;
  bad_sum += 1e100;
  bad_sum += 1;
  bad_sum += -1e100;
  BOOST_TEST_EQ(bad_sum, 0); // instead of 2

  using s_t = accumulators::sum<double>;
  s_t sum;
  ++sum;
  BOOST_TEST_EQ(sum, 1);
  BOOST_TEST_EQ(sum.value(), 1);
  BOOST_TEST_EQ(sum.large(), 1);
  BOOST_TEST_EQ(sum.small(), 0);
  BOOST_TEST_EQ(str(sum), "sum(1 + 0)"s);
  BOOST_TEST_EQ(str(sum, 15, false), "     sum(1 + 0)"s);
  BOOST_TEST_EQ(str(sum, 15, true), "sum(1 + 0)     "s);

  sum += 1e100;
  BOOST_TEST_EQ(sum, (s_t{1e100, 1}));
  ++sum;
  BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
  sum += -1e100;
  BOOST_TEST_EQ(sum, (s_t{0, 2}));
  BOOST_TEST_EQ(sum, 2); // correct answer
  BOOST_TEST_EQ(sum.value(), 2);
  BOOST_TEST_EQ(sum.large(), 0);
  BOOST_TEST_EQ(sum.small(), 2);

  sum = s_t{1e100, 1};
  sum += s_t{1e100, 1};
  BOOST_TEST_EQ(sum, (s_t{2e100, 2}));
  sum = s_t{1e100, 1};
  sum += s_t{1, 0};
  BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
  sum = s_t{1, 0};
  sum += s_t{1e100, 1};
  BOOST_TEST_EQ(sum, (s_t{1e100, 2}));
  sum = s_t{0, 1};
  sum += s_t{1, 0};
  BOOST_TEST_EQ(sum, (s_t{1, 1}));

  accumulators::sum<double> a{3}, b{2}, c{3};
  BOOST_TEST_LT(b, c);
  BOOST_TEST_LE(b, c);
  BOOST_TEST_LE(a, c);
  BOOST_TEST_GT(a, b);
  BOOST_TEST_GE(a, b);
  BOOST_TEST_GE(a, c);

  BOOST_TEST_EQ(s_t{} += s_t{}, s_t{});

  return boost::report_errors();
}