Average Error: 24.7 → 8.4
Time: 24.5s
Precision: 64
\[x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\]
\[\begin{array}{l} \mathbf{if}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -7.342154535502761255002856483850094084641 \cdot 10^{299}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\ \mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -9.503126818275096710413076784731225675465 \cdot 10^{-107}:\\ \;\;\;\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\\ \mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -4.184043045677409878056891844086754114776 \cdot 10^{-280} \lor \neg \left(x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le 0.0\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{t}, z, y\right) - \frac{z}{t} \cdot y\\ \end{array}\]
x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}
\begin{array}{l}
\mathbf{if}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -7.342154535502761255002856483850094084641 \cdot 10^{299}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\

\mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -9.503126818275096710413076784731225675465 \cdot 10^{-107}:\\
\;\;\;\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\\

\mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -4.184043045677409878056891844086754114776 \cdot 10^{-280} \lor \neg \left(x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le 0.0\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\

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

\end{array}
double f(double x, double y, double z, double t, double a) {
        double r577927 = x;
        double r577928 = y;
        double r577929 = r577928 - r577927;
        double r577930 = z;
        double r577931 = t;
        double r577932 = r577930 - r577931;
        double r577933 = r577929 * r577932;
        double r577934 = a;
        double r577935 = r577934 - r577931;
        double r577936 = r577933 / r577935;
        double r577937 = r577927 + r577936;
        return r577937;
}

double f(double x, double y, double z, double t, double a) {
        double r577938 = x;
        double r577939 = y;
        double r577940 = r577939 - r577938;
        double r577941 = z;
        double r577942 = t;
        double r577943 = r577941 - r577942;
        double r577944 = r577940 * r577943;
        double r577945 = a;
        double r577946 = r577945 - r577942;
        double r577947 = r577944 / r577946;
        double r577948 = r577938 + r577947;
        double r577949 = -7.342154535502761e+299;
        bool r577950 = r577948 <= r577949;
        double r577951 = 1.0;
        double r577952 = r577951 / r577943;
        double r577953 = r577952 * r577946;
        double r577954 = r577951 / r577953;
        double r577955 = fma(r577954, r577940, r577938);
        double r577956 = -9.503126818275097e-107;
        bool r577957 = r577948 <= r577956;
        double r577958 = -4.18404304567741e-280;
        bool r577959 = r577948 <= r577958;
        double r577960 = 0.0;
        bool r577961 = r577948 <= r577960;
        double r577962 = !r577961;
        bool r577963 = r577959 || r577962;
        double r577964 = r577938 / r577942;
        double r577965 = fma(r577964, r577941, r577939);
        double r577966 = r577941 / r577942;
        double r577967 = r577966 * r577939;
        double r577968 = r577965 - r577967;
        double r577969 = r577963 ? r577955 : r577968;
        double r577970 = r577957 ? r577948 : r577969;
        double r577971 = r577950 ? r577955 : r577970;
        return r577971;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original24.7
Target9.4
Herbie8.4
\[\begin{array}{l} \mathbf{if}\;a \lt -1.615306284544257464183904494091872805513 \cdot 10^{-142}:\\ \;\;\;\;x + \frac{y - x}{1} \cdot \frac{z - t}{a - t}\\ \mathbf{elif}\;a \lt 3.774403170083174201868024161554637965035 \cdot 10^{-182}:\\ \;\;\;\;y - \frac{z}{t} \cdot \left(y - x\right)\\ \mathbf{else}:\\ \;\;\;\;x + \frac{y - x}{1} \cdot \frac{z - t}{a - t}\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if (+ x (/ (* (- y x) (- z t)) (- a t))) < -7.342154535502761e+299 or -9.503126818275097e-107 < (+ x (/ (* (- y x) (- z t)) (- a t))) < -4.18404304567741e-280 or 0.0 < (+ x (/ (* (- y x) (- z t)) (- a t)))

    1. Initial program 29.1

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

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

      \[\leadsto \mathsf{fma}\left(\color{blue}{\frac{1}{\frac{a - t}{z - t}}}, y - x, x\right)\]
    5. Using strategy rm
    6. Applied div-inv9.3

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

    if -7.342154535502761e+299 < (+ x (/ (* (- y x) (- z t)) (- a t))) < -9.503126818275097e-107

    1. Initial program 1.7

      \[x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\]

    if -4.18404304567741e-280 < (+ x (/ (* (- y x) (- z t)) (- a t))) < 0.0

    1. Initial program 59.5

      \[x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\]
    2. Simplified59.5

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{z - t}{a - t}, y - x, x\right)}\]
    3. Taylor expanded around inf 19.1

      \[\leadsto \color{blue}{\left(y + \frac{x \cdot z}{t}\right) - \frac{z \cdot y}{t}}\]
    4. Simplified21.6

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -7.342154535502761255002856483850094084641 \cdot 10^{299}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\ \mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -9.503126818275096710413076784731225675465 \cdot 10^{-107}:\\ \;\;\;\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t}\\ \mathbf{elif}\;x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le -4.184043045677409878056891844086754114776 \cdot 10^{-280} \lor \neg \left(x + \frac{\left(y - x\right) \cdot \left(z - t\right)}{a - t} \le 0.0\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{\frac{1}{z - t} \cdot \left(a - t\right)}, y - x, x\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{t}, z, y\right) - \frac{z}{t} \cdot y\\ \end{array}\]

Reproduce

herbie shell --seed 2019194 +o rules:numerics
(FPCore (x y z t a)
  :name "Graphics.Rendering.Chart.Axis.Types:linMap from Chart-1.5.3"

  :herbie-target
  (if (< a -1.6153062845442575e-142) (+ x (* (/ (- y x) 1.0) (/ (- z t) (- a t)))) (if (< a 3.774403170083174e-182) (- y (* (/ z t) (- y x))) (+ x (* (/ (- y x) 1.0) (/ (- z t) (- a t))))))

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