# Handle Nans and Infs gracefully
return float(xbar), float(xbar) / float(ss)
+def _sqrtprod(x: float, y: float) -> float:
+ "Return sqrt(x * y) computed with high accuracy."
+ # Square root differential correction:
+ # https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0
+ h = sqrt(x * y)
+ x = sumprod((x, h), (y, -h))
+ return h + x / (2.0 * h)
+
# === Statistics for relations between two inputs ===
sxx = sumprod(x, x)
syy = sumprod(y, y)
try:
- return sxy / sqrt(sxx * syy)
+ return sxy / _sqrtprod(sxx, syy)
except ZeroDivisionError:
raise StatisticsError('at least one of the inputs is constant')