public static function arithmeticGeometricMean($x, $y) : float
{
// x or y < 0 = NaN
if ($x < 0 || $y < 0) {
return \NAN;
}
// x or y zero = 0
if ($x == 0 || $y == 0) {
return 0;
}
// Standard case x and y > 0
list($a, $g) = [$x, $y];
foreach (range(1, 10) as $_) {
list($a, $g) = [self::mean([$a, $g]), self::geometricMean([$a, $g])];
}
return $a;
}