0 ? $head++ : $tail--]; } return $result; } /** * Calculate multiplication of values (overflow safe). * * @param array $values * * @return float */ public static function safeMul(array $values): float { usort($values, function(float $a, float $b): int { return abs($a) <=> abs($b); }); $result = $values[0]; $head = 1; $tail = count($values) - 1; while ($head <= $tail) { $result *= $values[abs($result) > 1 ? $head++ : $tail--]; } return $result; } /** * Calculate average of values (overflow safe). * * @param array $values A non-empty array of values. * * @return float */ public static function safeAvg(array $values): float { sort($values, SORT_NUMERIC); $result = 0; $count = 1; $head = 0; $tail = count($values) - 1; while ($head <= $tail) { $value = $values[$result > 0 ? $head++ : $tail--]; // Expression optimized to avoid overflow. $result += $value / $count - $result / $count; $count++; } return $result; } }