x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;t \le -4.584406202812830128924411129162326193187 \cdot 10^{-168} \lor \neg \left(t \le 150412601825096175811127520041088581632\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 r242433 = x;
double r242434 = y;
double r242435 = z;
double r242436 = r242435 - r242433;
double r242437 = r242434 * r242436;
double r242438 = t;
double r242439 = r242437 / r242438;
double r242440 = r242433 + r242439;
return r242440;
}
double f(double x, double y, double z, double t) {
double r242441 = t;
double r242442 = -4.58440620281283e-168;
bool r242443 = r242441 <= r242442;
double r242444 = 1.5041260182509618e+38;
bool r242445 = r242441 <= r242444;
double r242446 = !r242445;
bool r242447 = r242443 || r242446;
double r242448 = y;
double r242449 = r242448 / r242441;
double r242450 = z;
double r242451 = x;
double r242452 = r242450 - r242451;
double r242453 = fma(r242449, r242452, r242451);
double r242454 = r242448 * r242452;
double r242455 = r242454 / r242441;
double r242456 = r242451 + r242455;
double r242457 = r242447 ? r242453 : r242456;
return r242457;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.5 |
|---|---|
| Target | 2.0 |
| Herbie | 1.6 |
if t < -4.58440620281283e-168 or 1.5041260182509618e+38 < t Initial program 8.4
Simplified1.4
if -4.58440620281283e-168 < t < 1.5041260182509618e+38Initial program 2.0
Final simplification1.6
herbie shell --seed 2019306 +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)))