x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;t \le -7.07003647724086002 \cdot 10^{-303} \lor \neg \left(t \le 7.7584251326065252 \cdot 10^{-53}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z - x, x\right)\\
\mathbf{else}:\\
\;\;\;\;x + \frac{1}{\frac{t}{y \cdot \left(z - x\right)}}\\
\end{array}double f(double x, double y, double z, double t) {
double r283646 = x;
double r283647 = y;
double r283648 = z;
double r283649 = r283648 - r283646;
double r283650 = r283647 * r283649;
double r283651 = t;
double r283652 = r283650 / r283651;
double r283653 = r283646 + r283652;
return r283653;
}
double f(double x, double y, double z, double t) {
double r283654 = t;
double r283655 = -7.07003647724086e-303;
bool r283656 = r283654 <= r283655;
double r283657 = 7.758425132606525e-53;
bool r283658 = r283654 <= r283657;
double r283659 = !r283658;
bool r283660 = r283656 || r283659;
double r283661 = y;
double r283662 = r283661 / r283654;
double r283663 = z;
double r283664 = x;
double r283665 = r283663 - r283664;
double r283666 = fma(r283662, r283665, r283664);
double r283667 = 1.0;
double r283668 = r283661 * r283665;
double r283669 = r283654 / r283668;
double r283670 = r283667 / r283669;
double r283671 = r283664 + r283670;
double r283672 = r283660 ? r283666 : r283671;
return r283672;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.2 |
|---|---|
| Target | 2.2 |
| Herbie | 1.9 |
if t < -7.07003647724086e-303 or 7.758425132606525e-53 < t Initial program 6.9
Simplified1.8
if -7.07003647724086e-303 < t < 7.758425132606525e-53Initial program 2.3
rmApplied clear-num2.3
Final simplification1.9
herbie shell --seed 2020065 +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)))