x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;x + \frac{y \cdot \left(z - x\right)}{t} = -\infty \lor \neg \left(x + \frac{y \cdot \left(z - x\right)}{t} \le 1.390199870564766 \cdot 10^{300}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z - x, x\right)\\
\mathbf{else}:\\
\;\;\;\;x + \frac{y \cdot \left(z - x\right)}{t}\\
\end{array}double f(double x, double y, double z, double t) {
double r315495 = x;
double r315496 = y;
double r315497 = z;
double r315498 = r315497 - r315495;
double r315499 = r315496 * r315498;
double r315500 = t;
double r315501 = r315499 / r315500;
double r315502 = r315495 + r315501;
return r315502;
}
double f(double x, double y, double z, double t) {
double r315503 = x;
double r315504 = y;
double r315505 = z;
double r315506 = r315505 - r315503;
double r315507 = r315504 * r315506;
double r315508 = t;
double r315509 = r315507 / r315508;
double r315510 = r315503 + r315509;
double r315511 = -inf.0;
bool r315512 = r315510 <= r315511;
double r315513 = 1.3901998705647658e+300;
bool r315514 = r315510 <= r315513;
double r315515 = !r315514;
bool r315516 = r315512 || r315515;
double r315517 = r315504 / r315508;
double r315518 = fma(r315517, r315506, r315503);
double r315519 = r315516 ? r315518 : r315510;
return r315519;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.4 |
|---|---|
| Target | 2.2 |
| Herbie | 0.8 |
if (+ x (/ (* y (- z x)) t)) < -inf.0 or 1.3901998705647658e+300 < (+ x (/ (* y (- z x)) t)) Initial program 59.7
Simplified0.8
if -inf.0 < (+ x (/ (* y (- z x)) t)) < 1.3901998705647658e+300Initial program 0.8
Final simplification0.8
herbie shell --seed 2020033 +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)))