x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;t \le -2117257699034317484720128 \lor \neg \left(t \le 4.298768646380980053593446645561660090143 \cdot 10^{-219}\right):\\
\;\;\;\;\frac{y}{t} \cdot \left(z - x\right) + x\\
\mathbf{else}:\\
\;\;\;\;\left(\frac{z \cdot y}{t} - \frac{x \cdot y}{t}\right) + x\\
\end{array}double f(double x, double y, double z, double t) {
double r276456 = x;
double r276457 = y;
double r276458 = z;
double r276459 = r276458 - r276456;
double r276460 = r276457 * r276459;
double r276461 = t;
double r276462 = r276460 / r276461;
double r276463 = r276456 + r276462;
return r276463;
}
double f(double x, double y, double z, double t) {
double r276464 = t;
double r276465 = -2.1172576990343175e+24;
bool r276466 = r276464 <= r276465;
double r276467 = 4.29876864638098e-219;
bool r276468 = r276464 <= r276467;
double r276469 = !r276468;
bool r276470 = r276466 || r276469;
double r276471 = y;
double r276472 = r276471 / r276464;
double r276473 = z;
double r276474 = x;
double r276475 = r276473 - r276474;
double r276476 = r276472 * r276475;
double r276477 = r276476 + r276474;
double r276478 = r276473 * r276471;
double r276479 = r276478 / r276464;
double r276480 = r276474 * r276471;
double r276481 = r276480 / r276464;
double r276482 = r276479 - r276481;
double r276483 = r276482 + r276474;
double r276484 = r276470 ? r276477 : r276483;
return r276484;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 6.3 |
|---|---|
| Target | 2.0 |
| Herbie | 1.5 |
if t < -2.1172576990343175e+24 or 4.29876864638098e-219 < t Initial program 7.8
Simplified1.4
rmApplied fma-udef1.4
if -2.1172576990343175e+24 < t < 4.29876864638098e-219Initial program 1.9
Simplified3.9
rmApplied fma-udef3.9
rmApplied add-cube-cbrt4.6
Applied associate-*l*4.6
Taylor expanded around 0 1.9
Final simplification1.5
herbie shell --seed 2020001 +o rules:numerics
(FPCore (x y z t)
:name "Optimisation.CirclePacking:place from circle-packing-0.1.0.4, D"
:precision binary64
:herbie-target
(- x (+ (* x (/ y t)) (* (- z) (/ y t))))
(+ x (/ (* y (- z x)) t)))