From ddaf2407a95ddadf485fa0004a1313225f9d2825 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 29 Jul 2024 14:16:51 +0300 Subject: [PATCH] Fix math overflow crash in computing profiling statistics --- libs/util/include/psemek/util/statistics.hpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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)