Average Error: 24.4 → 10.0
Time: 4.3s
Precision: 64
\[x + \frac{\left(y - z\right) \cdot \left(t - x\right)}{a - z}\]
\[\begin{array}{l} \mathbf{if}\;z \le -2.144165143768362991760089872609493676713 \cdot 10^{186} \lor \neg \left(z \le 2.076744265404525669788852177351907204291 \cdot 10^{154}\right):\\ \;\;\;\;\mathsf{fma}\left(y, \frac{x}{z} - \frac{t}{z}, t\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{y - z}{a - z}, t - x, x\right)\\ \end{array}\]
x + \frac{\left(y - z\right) \cdot \left(t - x\right)}{a - z}
\begin{array}{l}
\mathbf{if}\;z \le -2.144165143768362991760089872609493676713 \cdot 10^{186} \lor \neg \left(z \le 2.076744265404525669788852177351907204291 \cdot 10^{154}\right):\\
\;\;\;\;\mathsf{fma}\left(y, \frac{x}{z} - \frac{t}{z}, t\right)\\

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

\end{array}
double f(double x, double y, double z, double t, double a) {
        double r611180 = x;
        double r611181 = y;
        double r611182 = z;
        double r611183 = r611181 - r611182;
        double r611184 = t;
        double r611185 = r611184 - r611180;
        double r611186 = r611183 * r611185;
        double r611187 = a;
        double r611188 = r611187 - r611182;
        double r611189 = r611186 / r611188;
        double r611190 = r611180 + r611189;
        return r611190;
}

double f(double x, double y, double z, double t, double a) {
        double r611191 = z;
        double r611192 = -2.144165143768363e+186;
        bool r611193 = r611191 <= r611192;
        double r611194 = 2.0767442654045257e+154;
        bool r611195 = r611191 <= r611194;
        double r611196 = !r611195;
        bool r611197 = r611193 || r611196;
        double r611198 = y;
        double r611199 = x;
        double r611200 = r611199 / r611191;
        double r611201 = t;
        double r611202 = r611201 / r611191;
        double r611203 = r611200 - r611202;
        double r611204 = fma(r611198, r611203, r611201);
        double r611205 = r611198 - r611191;
        double r611206 = a;
        double r611207 = r611206 - r611191;
        double r611208 = r611205 / r611207;
        double r611209 = r611201 - r611199;
        double r611210 = fma(r611208, r611209, r611199);
        double r611211 = r611197 ? r611204 : r611210;
        return r611211;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original24.4
Target11.9
Herbie10.0
\[\begin{array}{l} \mathbf{if}\;z \lt -1.253613105609503593846459977496550767343 \cdot 10^{188}:\\ \;\;\;\;t - \frac{y}{z} \cdot \left(t - x\right)\\ \mathbf{elif}\;z \lt 4.446702369113811028051510715777703865332 \cdot 10^{64}:\\ \;\;\;\;x + \frac{y - z}{\frac{a - z}{t - x}}\\ \mathbf{else}:\\ \;\;\;\;t - \frac{y}{z} \cdot \left(t - x\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if z < -2.144165143768363e+186 or 2.0767442654045257e+154 < z

    1. Initial program 48.0

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

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

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

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

    if -2.144165143768363e+186 < z < 2.0767442654045257e+154

    1. Initial program 16.7

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -2.144165143768362991760089872609493676713 \cdot 10^{186} \lor \neg \left(z \le 2.076744265404525669788852177351907204291 \cdot 10^{154}\right):\\ \;\;\;\;\mathsf{fma}\left(y, \frac{x}{z} - \frac{t}{z}, t\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{y - z}{a - z}, t - x, x\right)\\ \end{array}\]

Reproduce

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

  :herbie-target
  (if (< z -1.2536131056095036e+188) (- t (* (/ y z) (- t x))) (if (< z 4.446702369113811e+64) (+ x (/ (- y z) (/ (- a z) (- t x)))) (- t (* (/ y z) (- t x)))))

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