(FPCore (x y z) :precision binary64 (/ (* x y) (* (* z z) (+ z 1.0))))
(FPCore (x y z)
:precision binary64
(if (<= (* x y) -2e+205)
(/ (/ y z) (fma (/ z x) z (/ z x)))
(if (<= (* x y) 2e+127)
(/ (/ x (/ z y)) (fma z z z))
(/ (/ y z) (/ z (/ x z))))))double code(double x, double y, double z) {
return (x * y) / ((z * z) * (z + 1.0));
}
double code(double x, double y, double z) {
double tmp;
if ((x * y) <= -2e+205) {
tmp = (y / z) / fma((z / x), z, (z / x));
} else if ((x * y) <= 2e+127) {
tmp = (x / (z / y)) / fma(z, z, z);
} else {
tmp = (y / z) / (z / (x / z));
}
return tmp;
}
function code(x, y, z) return Float64(Float64(x * y) / Float64(Float64(z * z) * Float64(z + 1.0))) end
function code(x, y, z) tmp = 0.0 if (Float64(x * y) <= -2e+205) tmp = Float64(Float64(y / z) / fma(Float64(z / x), z, Float64(z / x))); elseif (Float64(x * y) <= 2e+127) tmp = Float64(Float64(x / Float64(z / y)) / fma(z, z, z)); else tmp = Float64(Float64(y / z) / Float64(z / Float64(x / z))); end return tmp end
code[x_, y_, z_] := N[(N[(x * y), $MachinePrecision] / N[(N[(z * z), $MachinePrecision] * N[(z + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_] := If[LessEqual[N[(x * y), $MachinePrecision], -2e+205], N[(N[(y / z), $MachinePrecision] / N[(N[(z / x), $MachinePrecision] * z + N[(z / x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[N[(x * y), $MachinePrecision], 2e+127], N[(N[(x / N[(z / y), $MachinePrecision]), $MachinePrecision] / N[(z * z + z), $MachinePrecision]), $MachinePrecision], N[(N[(y / z), $MachinePrecision] / N[(z / N[(x / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\frac{x \cdot y}{\left(z \cdot z\right) \cdot \left(z + 1\right)}
\begin{array}{l}
\mathbf{if}\;x \cdot y \leq -2 \cdot 10^{+205}:\\
\;\;\;\;\frac{\frac{y}{z}}{\mathsf{fma}\left(\frac{z}{x}, z, \frac{z}{x}\right)}\\
\mathbf{elif}\;x \cdot y \leq 2 \cdot 10^{+127}:\\
\;\;\;\;\frac{\frac{x}{\frac{z}{y}}}{\mathsf{fma}\left(z, z, z\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{y}{z}}{\frac{z}{\frac{x}{z}}}\\
\end{array}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 14.6 |
|---|---|
| Target | 4.1 |
| Herbie | 3.0 |
if (*.f64 x y) < -2.00000000000000003e205Initial program 39.8
Simplified13.7
Applied egg-rr13.8
Taylor expanded in z around 0 13.9
Simplified2.2
if -2.00000000000000003e205 < (*.f64 x y) < 1.99999999999999991e127Initial program 10.2
Simplified3.6
Applied egg-rr2.5
Applied egg-rr2.4
if 1.99999999999999991e127 < (*.f64 x y) Initial program 30.2
Simplified11.6
Applied egg-rr11.7
Taylor expanded in z around inf 16.2
Simplified7.8
Final simplification3.0
herbie shell --seed 2022162
(FPCore (x y z)
:name "Statistics.Distribution.Beta:$cvariance from math-functions-0.1.5.2"
:precision binary64
:herbie-target
(if (< z 249.6182814532307) (/ (* y (/ x z)) (+ z (* z z))) (/ (* (/ (/ y z) (+ 1.0 z)) x) z))
(/ (* x y) (* (* z z) (+ z 1.0))))