17#ifndef TOOLBOX_UTIL_MATH_HPP
18#define TOOLBOX_UTIL_MATH_HPP
29inline namespace util {
34 return n > 0 && (
n & (
n - 1)) == 0;
40 return n <= 1 ? 1 : 1 << (
sizeof(
n) * 8 - std::countl_zero(
n - 1));
46 return n <= 1 ? 1 : 1 << (
sizeof(
n) * 8 - std::countl_zero(
n - 1));
69 bool empty() const noexcept {
return size_ == 0; }
70 std::size_t
size() const noexcept {
return size_; }
71 double mean() const noexcept {
return mean_; }
72 double sum2() const noexcept {
return sum2_; }
73 double min() const noexcept {
return min_; }
74 double max() const noexcept {
return max_; }
81 min_ = std::numeric_limits<double>::max();
82 max_ = std::numeric_limits<double>::min();
87 double delta{val - mean_};
88 mean_ += delta / size_;
89 sum2_ += delta * (val - mean_);
90 min_ = std::min(min_, val);
91 max_ = std::max(max_, val);
93 template <
typename... ArgsT>
94 void append(
double first, ArgsT... args)
noexcept
102 std::size_t size_{0};
105 double min_{std::numeric_limits<double>::max()};
106 double max_{std::numeric_limits<double>::min()};
111 return v.size() > 1 ?
v.sum2() / (
v.size() - 1) : std::numeric_limits<double>::quiet_NaN();
116 return !
v.empty() ?
v.sum2() /
v.size() : std::numeric_limits<double>::quiet_NaN();
121 return std::sqrt(
var(
v));
126 return std::sqrt(
varp(
v));
137 return mean + 1.6448536 *
sd;
143 return mean + 2.3263479 *
sd;
149 return mean + 3.0902323 *
sd;
161constexpr std::uint64_t
pow10(
int n)
noexcept {
179 10000000000000000ULL,
180 100000000000000000ULL,
181 1000000000000000000ULL,
182 10000000000000000000ULL
v append(1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299)