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();
}
|