x + \frac{y \cdot \left(z - x\right)}{t}\begin{array}{l}
\mathbf{if}\;x \le -0.9629836673913925171319760920596309006214 \lor \neg \left(x \le -1.021438175035185208933238332581775397762 \cdot 10^{-218}\right):\\
\;\;\;\;\mathsf{fma}\left(z - x, \frac{y}{t}, x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(z - x\right) \cdot y}{t} + x\\
\end{array}double f(double x, double y, double z, double t) {
double r265978 = x;
double r265979 = y;
double r265980 = z;
double r265981 = r265980 - r265978;
double r265982 = r265979 * r265981;
double r265983 = t;
double r265984 = r265982 / r265983;
double r265985 = r265978 + r265984;
return r265985;
}
double f(double x, double y, double z, double t) {
double r265986 = x;
double r265987 = -0.9629836673913925;
bool r265988 = r265986 <= r265987;
double r265989 = -1.0214381750351852e-218;
bool r265990 = r265986 <= r265989;
double r265991 = !r265990;
bool r265992 = r265988 || r265991;
double r265993 = z;
double r265994 = r265993 - r265986;
double r265995 = y;
double r265996 = t;
double r265997 = r265995 / r265996;
double r265998 = fma(r265994, r265997, r265986);
double r265999 = r265994 * r265995;
double r266000 = r265999 / r265996;
double r266001 = r266000 + r265986;
double r266002 = r265992 ? r265998 : r266001;
return r266002;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.6 |
|---|---|
| Target | 2.0 |
| Herbie | 2.3 |
if x < -0.9629836673913925 or -1.0214381750351852e-218 < x Initial program 7.1
Simplified1.8
if -0.9629836673913925 < x < -1.0214381750351852e-218Initial program 4.6
Final simplification2.3
herbie shell --seed 2019196 +o rules:numerics
(FPCore (x y z t)
:name "Optimisation.CirclePacking:place from circle-packing-0.1.0.4, D"
:herbie-target
(- x (+ (* x (/ y t)) (* (- z) (/ y t))))
(+ x (/ (* y (- z x)) t)))