x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;t \le -3.1568940568519223 \cdot 10^{78} \lor \neg \left(t \le 3.1796045355482281 \cdot 10^{-75}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z - x, x\right)\\
\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 r446176 = x;
double r446177 = y;
double r446178 = z;
double r446179 = r446178 - r446176;
double r446180 = r446177 * r446179;
double r446181 = t;
double r446182 = r446180 / r446181;
double r446183 = r446176 + r446182;
return r446183;
}
double f(double x, double y, double z, double t) {
double r446184 = t;
double r446185 = -3.1568940568519223e+78;
bool r446186 = r446184 <= r446185;
double r446187 = 3.179604535548228e-75;
bool r446188 = r446184 <= r446187;
double r446189 = !r446188;
bool r446190 = r446186 || r446189;
double r446191 = y;
double r446192 = r446191 / r446184;
double r446193 = z;
double r446194 = x;
double r446195 = r446193 - r446194;
double r446196 = fma(r446192, r446195, r446194);
double r446197 = r446193 * r446191;
double r446198 = r446197 / r446184;
double r446199 = r446194 * r446191;
double r446200 = r446199 / r446184;
double r446201 = r446198 - r446200;
double r446202 = r446201 + r446194;
double r446203 = r446190 ? r446196 : r446202;
return r446203;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.5 |
|---|---|
| Target | 2.2 |
| Herbie | 1.6 |
if t < -3.1568940568519223e+78 or 3.179604535548228e-75 < t Initial program 9.4
Simplified1.1
if -3.1568940568519223e+78 < t < 3.179604535548228e-75Initial program 2.2
Simplified3.9
rmApplied fma-udef3.9
Simplified12.7
Taylor expanded around 0 2.2
Final simplification1.6
herbie shell --seed 2020042 +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)))