diff --git a/libs/util/include/psemek/util/statistics.hpp b/libs/util/include/psemek/util/statistics.hpp index e17afd1c..a25a539a 100644 --- a/libs/util/include/psemek/util/statistics.hpp +++ b/libs/util/include/psemek/util/statistics.hpp @@ -94,16 +94,24 @@ namespace psemek::util // https://en.wikipedia.org/wiki/Maximum_entropy_probability_distribution#Other_examples // https://en.wikipedia.org/wiki/Truncated_normal_distribution - float const mu = mean(); - float const sigma = stddev(); + T const mu = mean(); + T const sigma = stddev(); if (sigma == T{0}) return mu; - float const alpha = (min - mu) / sigma; - float const beta = (max - mu) / sigma; + T const alpha = (min - mu) / sigma; + T const beta = (max - mu) / sigma; - return mu + sigma * detail::normal_cdf_inv(std::lerp(detail::normal_cdf(alpha), detail::normal_cdf(beta), p)); + T const t = std::lerp(detail::normal_cdf(alpha), detail::normal_cdf(beta), p); + + if (t <= T{0}) + return min; + + if (t >= T{1}) + return max; + + return mu + sigma * detail::normal_cdf_inv(t); } friend base_statistics merge(base_statistics const & s1, base_statistics const & s2)