\left(x \cdot y - z \cdot y\right) \cdot t
\begin{array}{l}
\mathbf{if}\;y \le -3.9370635120425994 \cdot 10^{-9} \lor \neg \left(y \le 46208978636311126000\right):\\
\;\;\;\;\left(t \cdot \left(1 \cdot {\left(\sqrt[3]{x}\right)}^{3} + \left(-z\right)\right)\right) \cdot y + \left(y \cdot \mathsf{fma}\left(-z, 1, z\right)\right) \cdot t\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(t, x \cdot y, \left(\sqrt[3]{t \cdot \left(\left(-z\right) \cdot y\right)} \cdot \sqrt[3]{t \cdot \left(\left(-z\right) \cdot y\right)}\right) \cdot \sqrt[3]{t \cdot \left(\left(-z\right) \cdot y\right)}\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r539181 = x;
double r539182 = y;
double r539183 = r539181 * r539182;
double r539184 = z;
double r539185 = r539184 * r539182;
double r539186 = r539183 - r539185;
double r539187 = t;
double r539188 = r539186 * r539187;
return r539188;
}
double f(double x, double y, double z, double t) {
double r539189 = y;
double r539190 = -3.9370635120425994e-09;
bool r539191 = r539189 <= r539190;
double r539192 = 4.620897863631113e+19;
bool r539193 = r539189 <= r539192;
double r539194 = !r539193;
bool r539195 = r539191 || r539194;
double r539196 = t;
double r539197 = 1.0;
double r539198 = x;
double r539199 = cbrt(r539198);
double r539200 = 3.0;
double r539201 = pow(r539199, r539200);
double r539202 = r539197 * r539201;
double r539203 = z;
double r539204 = -r539203;
double r539205 = r539202 + r539204;
double r539206 = r539196 * r539205;
double r539207 = r539206 * r539189;
double r539208 = fma(r539204, r539197, r539203);
double r539209 = r539189 * r539208;
double r539210 = r539209 * r539196;
double r539211 = r539207 + r539210;
double r539212 = r539198 * r539189;
double r539213 = r539204 * r539189;
double r539214 = r539196 * r539213;
double r539215 = cbrt(r539214);
double r539216 = r539215 * r539215;
double r539217 = r539216 * r539215;
double r539218 = fma(r539196, r539212, r539217);
double r539219 = r539195 ? r539211 : r539218;
return r539219;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 7.1 |
|---|---|
| Target | 3.2 |
| Herbie | 2.9 |
if y < -3.9370635120425994e-09 or 4.620897863631113e+19 < y Initial program 15.7
Simplified15.7
rmApplied add-cube-cbrt16.1
Applied add-cube-cbrt16.5
Applied prod-diff16.5
Applied distribute-lft-in16.5
Applied distribute-lft-in16.5
Simplified11.6
Simplified3.8
if -3.9370635120425994e-09 < y < 4.620897863631113e+19Initial program 2.0
Simplified2.0
rmApplied sub-neg2.0
Applied distribute-lft-in2.0
Applied distribute-lft-in2.0
Simplified2.0
Simplified2.0
rmApplied fma-def2.0
rmApplied add-cube-cbrt2.4
Final simplification2.9
herbie shell --seed 2020083 +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))