Average Error: 2.2 → 2.2
Time: 14.5s
Precision: 64
\[\frac{x}{y} \cdot \left(z - t\right) + t\]
\[\begin{array}{l} \mathbf{if}\;t \le -6.904120390825682619763527695919909441702 \cdot 10^{-275} \lor \neg \left(t \le 3.156622071944891387963639537805442137426 \cdot 10^{-195}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\frac{x \cdot z}{y} - \frac{t \cdot x}{y}\right) + t\\ \end{array}\]
\frac{x}{y} \cdot \left(z - t\right) + t
\begin{array}{l}
\mathbf{if}\;t \le -6.904120390825682619763527695919909441702 \cdot 10^{-275} \lor \neg \left(t \le 3.156622071944891387963639537805442137426 \cdot 10^{-195}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)\\

\mathbf{else}:\\
\;\;\;\;\left(\frac{x \cdot z}{y} - \frac{t \cdot x}{y}\right) + t\\

\end{array}
double f(double x, double y, double z, double t) {
        double r375842 = x;
        double r375843 = y;
        double r375844 = r375842 / r375843;
        double r375845 = z;
        double r375846 = t;
        double r375847 = r375845 - r375846;
        double r375848 = r375844 * r375847;
        double r375849 = r375848 + r375846;
        return r375849;
}

double f(double x, double y, double z, double t) {
        double r375850 = t;
        double r375851 = -6.904120390825683e-275;
        bool r375852 = r375850 <= r375851;
        double r375853 = 3.1566220719448914e-195;
        bool r375854 = r375850 <= r375853;
        double r375855 = !r375854;
        bool r375856 = r375852 || r375855;
        double r375857 = x;
        double r375858 = y;
        double r375859 = r375857 / r375858;
        double r375860 = z;
        double r375861 = r375860 - r375850;
        double r375862 = fma(r375859, r375861, r375850);
        double r375863 = r375857 * r375860;
        double r375864 = r375863 / r375858;
        double r375865 = r375850 * r375857;
        double r375866 = r375865 / r375858;
        double r375867 = r375864 - r375866;
        double r375868 = r375867 + r375850;
        double r375869 = r375856 ? r375862 : r375868;
        return r375869;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Target

Original2.2
Target2.3
Herbie2.2
\[\begin{array}{l} \mathbf{if}\;z \lt 2.759456554562692182563154937894909044548 \cdot 10^{-282}:\\ \;\;\;\;\frac{x}{y} \cdot \left(z - t\right) + t\\ \mathbf{elif}\;z \lt 2.32699445087443595687739933019129648094 \cdot 10^{-110}:\\ \;\;\;\;x \cdot \frac{z - t}{y} + t\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{y} \cdot \left(z - t\right) + t\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if t < -6.904120390825683e-275 or 3.1566220719448914e-195 < t

    1. Initial program 1.7

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

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

    if -6.904120390825683e-275 < t < 3.1566220719448914e-195

    1. Initial program 5.7

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)}\]
    3. Using strategy rm
    4. Applied fma-udef5.7

      \[\leadsto \color{blue}{\frac{x}{y} \cdot \left(z - t\right) + t}\]
    5. Simplified5.7

      \[\leadsto \color{blue}{\frac{z - t}{y} \cdot x} + t\]
    6. Taylor expanded around 0 5.3

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;t \le -6.904120390825682619763527695919909441702 \cdot 10^{-275} \lor \neg \left(t \le 3.156622071944891387963639537805442137426 \cdot 10^{-195}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\frac{x \cdot z}{y} - \frac{t \cdot x}{y}\right) + t\\ \end{array}\]

Reproduce

herbie shell --seed 2019212 +o rules:numerics
(FPCore (x y z t)
  :name "Numeric.Signal.Multichannel:$cget from hsignal-0.2.7.1"
  :precision binary64

  :herbie-target
  (if (< z 2.7594565545626922e-282) (+ (* (/ x y) (- z t)) t) (if (< z 2.326994450874436e-110) (+ (* x (/ (- z t) y)) t) (+ (* (/ x y) (- z t)) t)))

  (+ (* (/ x y) (- z t)) t))