17constexpr float neutral = 1.F;
21fastpow(
double a,
double b) ->
float
24 std::memcpy(&u, &a,
sizeof a);
25 u[1] =
static_cast<int>(b * (u[1] - 1072632447) + 1072632447);
27 std::memcpy(&a, &u,
sizeof a);
28 return static_cast<float>(a);
33fastsqrt(
float _in) ->
float
38 const auto in = _mm_load_ss(&_in);
40 _mm_store_ss(&out, _mm_mul_ss(in, _mm_rsqrt_ss(in)));
46sum(
const std::vector<T>& v) -> T
48 return std::accumulate(begin(v), end(v),
static_cast<T
>(0));
53mean(
const std::vector<T>& v) ->
float
55 return static_cast<float>(sum(v)) /
static_cast<float>(v.size());
60cv(
const std::vector<float>& input) ->
float
63 const auto average = mean(input);
64 for (
auto i : input) {
65 sd += (i - average) * (i - average);
68 return fastsqrt(sd /
static_cast<float>(input.size())) / average;
74cv_trunc_fill(
const std::vector<float>& input,
76 const float& ms_dummy) ->
float
78 int input_sz =
static_cast<int>(input.size());
81 if (input_sz >= num_vals) {
82 for (
int i = 0; i < std::min(input_sz, num_vals); ++i) {
85 average /=
static_cast<float>(num_vals);
87 for (
int i = 0; i < std::min(input_sz, num_vals); ++i) {
88 sd += (input[i] - average) * (input[i] - average);
91 return fastsqrt(sd /
static_cast<float>(num_vals)) / average;
94 for (
int i = 0; i < std::min(input_sz, num_vals); ++i) {
99 for (
int i = 0; i < num_vals - input_sz; ++i) {
102 average /=
static_cast<float>(num_vals);
104 for (
int i = 0; i < std::min(input_sz, num_vals); ++i) {
105 sd += (input[i] - average) * (input[i] - average);
108 for (
int i = 0; i < num_vals - input_sz; ++i) {
109 sd += (ms_dummy - average) * (ms_dummy - average);
112 return fastsqrt(sd /
static_cast<float>(num_vals)) / average;
116sum_trunc_fill(
const std::vector<float>& input,
118 const float& ms_dummy) ->
float
120 int input_sz =
static_cast<int>(input.size());
123 for (
int i = 0; i < std::min(input_sz, num_vals); ++i) {
128 if (input_sz >= num_vals) {
133 for (
int i = 0; i < num_vals -
static_cast<int>(input_sz); ++i) {
141div_high_by_low(
float a,
float b) ->
float
150div_low_by_high(
float a,
float b) ->
float
159diff_high_by_low(
int a,
int b) ->
int
168weighted_average(
const float& a,
const float& b,
const float& x,
const float& y)
171 return (x * a + ((y - x) * b)) / y;
175lerp(
float t,
float a,
float b) ->
float
177 return (1.F - t)*a + t*b;