\left(x \cdot y - z \cdot y\right) \cdot t
\begin{array}{l}
\mathbf{if}\;z \le -3.09483419664136275 \cdot 10^{-215}:\\
\;\;\;\;\left(t \cdot y\right) \cdot \left(x - z\right)\\
\mathbf{else}:\\
\;\;\;\;\left(t \cdot x + t \cdot \left(-z\right)\right) \cdot y + \left(y \cdot \mathsf{fma}\left(-z, 1, z\right)\right) \cdot t\\
\end{array}double f(double x, double y, double z, double t) {
double r498074 = x;
double r498075 = y;
double r498076 = r498074 * r498075;
double r498077 = z;
double r498078 = r498077 * r498075;
double r498079 = r498076 - r498078;
double r498080 = t;
double r498081 = r498079 * r498080;
return r498081;
}
double f(double x, double y, double z, double t) {
double r498082 = z;
double r498083 = -3.094834196641363e-215;
bool r498084 = r498082 <= r498083;
double r498085 = t;
double r498086 = y;
double r498087 = r498085 * r498086;
double r498088 = x;
double r498089 = r498088 - r498082;
double r498090 = r498087 * r498089;
double r498091 = r498085 * r498088;
double r498092 = -r498082;
double r498093 = r498085 * r498092;
double r498094 = r498091 + r498093;
double r498095 = r498094 * r498086;
double r498096 = 1.0;
double r498097 = fma(r498092, r498096, r498082);
double r498098 = r498086 * r498097;
double r498099 = r498098 * r498085;
double r498100 = r498095 + r498099;
double r498101 = r498084 ? r498090 : r498100;
return r498101;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 7.3 |
|---|---|
| Target | 3.0 |
| Herbie | 6.7 |
if z < -3.094834196641363e-215Initial program 7.7
Simplified7.7
rmApplied associate-*r*6.6
if -3.094834196641363e-215 < z Initial program 7.0
Simplified7.0
rmApplied add-cube-cbrt7.3
Applied add-cube-cbrt7.8
Applied prod-diff7.8
Applied distribute-lft-in7.8
Applied distribute-lft-in7.8
Simplified9.8
Simplified7.2
rmApplied distribute-lft-in7.2
Simplified6.8
Final simplification6.7
herbie shell --seed 2020033 +o rules:numerics
(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))