\frac{x \cdot y}{z}\begin{array}{l}
\mathbf{if}\;x \cdot y \le -2.0212306242717315 \cdot 10^{115}:\\
\;\;\;\;x \cdot \frac{y}{z}\\
\mathbf{elif}\;x \cdot y \le -2.08794536631012826 \cdot 10^{-85}:\\
\;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z}\\
\mathbf{elif}\;x \cdot y \le 0.0:\\
\;\;\;\;\frac{x}{z} \cdot y\\
\mathbf{else}:\\
\;\;\;\;\left(x \cdot y\right) \cdot \frac{1}{z}\\
\end{array}double f(double x, double y, double z) {
double r717788 = x;
double r717789 = y;
double r717790 = r717788 * r717789;
double r717791 = z;
double r717792 = r717790 / r717791;
return r717792;
}
double f(double x, double y, double z) {
double r717793 = x;
double r717794 = y;
double r717795 = r717793 * r717794;
double r717796 = -2.0212306242717315e+115;
bool r717797 = r717795 <= r717796;
double r717798 = z;
double r717799 = r717794 / r717798;
double r717800 = r717793 * r717799;
double r717801 = -2.0879453663101283e-85;
bool r717802 = r717795 <= r717801;
double r717803 = 1.0;
double r717804 = r717803 / r717798;
double r717805 = r717795 * r717804;
double r717806 = 0.0;
bool r717807 = r717795 <= r717806;
double r717808 = r717793 / r717798;
double r717809 = r717808 * r717794;
double r717810 = r717807 ? r717809 : r717805;
double r717811 = r717802 ? r717805 : r717810;
double r717812 = r717797 ? r717800 : r717811;
return r717812;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 5.8 |
|---|---|
| Target | 5.9 |
| Herbie | 2.9 |
if (* x y) < -2.0212306242717315e+115Initial program 13.5
rmApplied *-un-lft-identity13.5
Applied times-frac3.0
Simplified3.0
if -2.0212306242717315e+115 < (* x y) < -2.0879453663101283e-85 or 0.0 < (* x y) Initial program 3.1
rmApplied div-inv3.1
if -2.0879453663101283e-85 < (* x y) < 0.0Initial program 9.0
rmApplied associate-/l*1.9
rmApplied associate-/r/2.2
Final simplification2.9
herbie shell --seed 2020056 +o rules:numerics
(FPCore (x y z)
:name "Diagrams.Solve.Tridiagonal:solveCyclicTriDiagonal from diagrams-solve-0.1, A"
:precision binary64
:herbie-target
(if (< z -4.262230790519429e-138) (/ (* x y) z) (if (< z 1.7042130660650472e-164) (/ x (/ z y)) (* (/ x z) y)))
(/ (* x y) z))