\frac{x \cdot 2}{y \cdot z - t \cdot z}\begin{array}{l}
\mathbf{if}\;x \le -0.031032483723507254 \lor \neg \left(x \le 3.6948490856919295 \cdot 10^{-142}\right):\\
\;\;\;\;\frac{1}{z} \cdot \frac{x}{\frac{y - t}{2}}\\
\mathbf{else}:\\
\;\;\;\;x \cdot \frac{\frac{2}{y - t}}{z}\\
\end{array}double f(double x, double y, double z, double t) {
double r562662 = x;
double r562663 = 2.0;
double r562664 = r562662 * r562663;
double r562665 = y;
double r562666 = z;
double r562667 = r562665 * r562666;
double r562668 = t;
double r562669 = r562668 * r562666;
double r562670 = r562667 - r562669;
double r562671 = r562664 / r562670;
return r562671;
}
double f(double x, double y, double z, double t) {
double r562672 = x;
double r562673 = -0.031032483723507254;
bool r562674 = r562672 <= r562673;
double r562675 = 3.6948490856919295e-142;
bool r562676 = r562672 <= r562675;
double r562677 = !r562676;
bool r562678 = r562674 || r562677;
double r562679 = 1.0;
double r562680 = z;
double r562681 = r562679 / r562680;
double r562682 = y;
double r562683 = t;
double r562684 = r562682 - r562683;
double r562685 = 2.0;
double r562686 = r562684 / r562685;
double r562687 = r562672 / r562686;
double r562688 = r562681 * r562687;
double r562689 = r562685 / r562684;
double r562690 = r562689 / r562680;
double r562691 = r562672 * r562690;
double r562692 = r562678 ? r562688 : r562691;
return r562692;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 6.9 |
|---|---|
| Target | 2.1 |
| Herbie | 2.7 |
if x < -0.031032483723507254 or 3.6948490856919295e-142 < x Initial program 9.5
Simplified8.5
rmApplied *-un-lft-identity8.5
Applied times-frac8.5
Applied *-un-lft-identity8.5
Applied times-frac3.0
Simplified3.0
if -0.031032483723507254 < x < 3.6948490856919295e-142Initial program 3.3
Simplified2.0
rmApplied div-inv2.3
Simplified2.3
Final simplification2.7
herbie shell --seed 2020021 +o rules:numerics
(FPCore (x y z t)
:name "Linear.Projection:infinitePerspective from linear-1.19.1.3, A"
:precision binary64
:herbie-target
(if (< (/ (* x 2) (- (* y z) (* t z))) -2.559141628295061e-13) (* (/ x (* (- y t) z)) 2) (if (< (/ (* x 2) (- (* y z) (* t z))) 1.0450278273301259e-269) (/ (* (/ x z) 2) (- y t)) (* (/ x (* (- y t) z)) 2)))
(/ (* x 2) (- (* y z) (* t z))))