Average Error: 6.6 → 2.3
Time: 15.8s
Precision: 64
\[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}\]
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;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Target

Original6.6
Target2.0
Herbie2.3
\[x - \left(x \cdot \frac{y}{t} + \left(-z\right) \cdot \frac{y}{t}\right)\]

Derivation

  1. Split input into 2 regimes
  2. if x < -0.9629836673913925 or -1.0214381750351852e-218 < x

    1. Initial program 7.1

      \[x + \frac{y \cdot \left(z - x\right)}{t}\]
    2. Simplified1.8

      \[\leadsto \color{blue}{\mathsf{fma}\left(z - x, \frac{y}{t}, x\right)}\]

    if -0.9629836673913925 < x < -1.0214381750351852e-218

    1. Initial program 4.6

      \[x + \frac{y \cdot \left(z - x\right)}{t}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.3

    \[\leadsto \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}\]

Reproduce

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