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 r322676 = x;
double r322677 = y;
double r322678 = z;
double r322679 = r322678 - r322676;
double r322680 = r322677 * r322679;
double r322681 = t;
double r322682 = r322680 / r322681;
double r322683 = r322676 + r322682;
return r322683;
}
double f(double x, double y, double z, double t) {
double r322684 = t;
double r322685 = -2.1172576990343175e+24;
bool r322686 = r322684 <= r322685;
double r322687 = 4.29876864638098e-219;
bool r322688 = r322684 <= r322687;
double r322689 = !r322688;
bool r322690 = r322686 || r322689;
double r322691 = y;
double r322692 = r322691 / r322684;
double r322693 = z;
double r322694 = x;
double r322695 = r322693 - r322694;
double r322696 = r322692 * r322695;
double r322697 = r322696 + r322694;
double r322698 = r322693 * r322691;
double r322699 = r322698 / r322684;
double r322700 = r322694 * r322691;
double r322701 = r322700 / r322684;
double r322702 = r322699 - r322701;
double r322703 = r322702 + r322694;
double r322704 = r322690 ? r322697 : r322703;
return r322704;
}




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)))