\left(x \cdot y - z \cdot y\right) \cdot t
\begin{array}{l}
\mathbf{if}\;y \le -2.650344883041308410572910824772997614991 \cdot 10^{-37} \lor \neg \left(y \le 9.863081147940308437771723311194267196393 \cdot 10^{-76}\right):\\
\;\;\;\;\left(t \cdot y\right) \cdot \left(x - z\right)\\
\mathbf{else}:\\
\;\;\;\;t \cdot \left(x \cdot y\right) + t \cdot \left(\left(-z\right) \cdot y\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r618962 = x;
double r618963 = y;
double r618964 = r618962 * r618963;
double r618965 = z;
double r618966 = r618965 * r618963;
double r618967 = r618964 - r618966;
double r618968 = t;
double r618969 = r618967 * r618968;
return r618969;
}
double f(double x, double y, double z, double t) {
double r618970 = y;
double r618971 = -2.6503448830413084e-37;
bool r618972 = r618970 <= r618971;
double r618973 = 9.863081147940308e-76;
bool r618974 = r618970 <= r618973;
double r618975 = !r618974;
bool r618976 = r618972 || r618975;
double r618977 = t;
double r618978 = r618977 * r618970;
double r618979 = x;
double r618980 = z;
double r618981 = r618979 - r618980;
double r618982 = r618978 * r618981;
double r618983 = r618979 * r618970;
double r618984 = r618977 * r618983;
double r618985 = -r618980;
double r618986 = r618985 * r618970;
double r618987 = r618977 * r618986;
double r618988 = r618984 + r618987;
double r618989 = r618976 ? r618982 : r618988;
return r618989;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 7.3 |
|---|---|
| Target | 3.1 |
| Herbie | 3.1 |
if y < -2.6503448830413084e-37 or 9.863081147940308e-76 < y Initial program 12.3
Simplified12.3
rmApplied associate-*r*3.7
if -2.6503448830413084e-37 < y < 9.863081147940308e-76Initial program 2.6
Simplified2.6
rmApplied sub-neg2.6
Applied distribute-lft-in2.6
Applied distribute-lft-in2.6
Simplified2.6
Simplified2.6
Final simplification3.1
herbie shell --seed 2020001
(FPCore (x y z t)
:name "Linear.Projection:inverseInfinitePerspective from linear-1.19.1.3"
:precision binary64
:herbie-target
(if (< t -9.231879582886777e-80) (* (* y t) (- x z)) (if (< t 2.543067051564877e+83) (* y (* t (- x z))) (* (* y (- x z)) t)))
(* (- (* x y) (* z y)) t))