Average Error: 10.3 → 1.6
Time: 18.1s
Precision: 64
\[\frac{x - y \cdot z}{t - a \cdot z}\]
\[\begin{array}{l} \mathbf{if}\;z \le -2.147501379453681047725513588483459387151 \cdot 10^{-37} \lor \neg \left(z \le 6.9713412473177113437097495394906217014 \cdot 10^{-63}\right):\\ \;\;\;\;\frac{x}{t - a \cdot z} - \frac{y}{\frac{t}{z} - a}\\ \mathbf{else}:\\ \;\;\;\;\frac{x - y \cdot z}{\mathsf{fma}\left(-z, a, t\right)}\\ \end{array}\]
\frac{x - y \cdot z}{t - a \cdot z}
\begin{array}{l}
\mathbf{if}\;z \le -2.147501379453681047725513588483459387151 \cdot 10^{-37} \lor \neg \left(z \le 6.9713412473177113437097495394906217014 \cdot 10^{-63}\right):\\
\;\;\;\;\frac{x}{t - a \cdot z} - \frac{y}{\frac{t}{z} - a}\\

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

\end{array}
double f(double x, double y, double z, double t, double a) {
        double r933570 = x;
        double r933571 = y;
        double r933572 = z;
        double r933573 = r933571 * r933572;
        double r933574 = r933570 - r933573;
        double r933575 = t;
        double r933576 = a;
        double r933577 = r933576 * r933572;
        double r933578 = r933575 - r933577;
        double r933579 = r933574 / r933578;
        return r933579;
}

double f(double x, double y, double z, double t, double a) {
        double r933580 = z;
        double r933581 = -2.147501379453681e-37;
        bool r933582 = r933580 <= r933581;
        double r933583 = 6.971341247317711e-63;
        bool r933584 = r933580 <= r933583;
        double r933585 = !r933584;
        bool r933586 = r933582 || r933585;
        double r933587 = x;
        double r933588 = t;
        double r933589 = a;
        double r933590 = r933589 * r933580;
        double r933591 = r933588 - r933590;
        double r933592 = r933587 / r933591;
        double r933593 = y;
        double r933594 = r933588 / r933580;
        double r933595 = r933594 - r933589;
        double r933596 = r933593 / r933595;
        double r933597 = r933592 - r933596;
        double r933598 = r933593 * r933580;
        double r933599 = r933587 - r933598;
        double r933600 = -r933580;
        double r933601 = fma(r933600, r933589, r933588);
        double r933602 = r933599 / r933601;
        double r933603 = r933586 ? r933597 : r933602;
        return r933603;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original10.3
Target1.8
Herbie1.6
\[\begin{array}{l} \mathbf{if}\;z \lt -32113435955957344:\\ \;\;\;\;\frac{x}{t - a \cdot z} - \frac{y}{\frac{t}{z} - a}\\ \mathbf{elif}\;z \lt 3.51395223729782958298856956410892592016 \cdot 10^{-86}:\\ \;\;\;\;\left(x - y \cdot z\right) \cdot \frac{1}{t - a \cdot z}\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{t - a \cdot z} - \frac{y}{\frac{t}{z} - a}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if z < -2.147501379453681e-37 or 6.971341247317711e-63 < z

    1. Initial program 17.8

      \[\frac{x - y \cdot z}{t - a \cdot z}\]
    2. Using strategy rm
    3. Applied div-sub17.8

      \[\leadsto \color{blue}{\frac{x}{t - a \cdot z} - \frac{y \cdot z}{t - a \cdot z}}\]
    4. Simplified11.6

      \[\leadsto \frac{x}{t - a \cdot z} - \color{blue}{y \cdot \frac{z}{t - a \cdot z}}\]
    5. Using strategy rm
    6. Applied clear-num11.7

      \[\leadsto \frac{x}{t - a \cdot z} - y \cdot \color{blue}{\frac{1}{\frac{t - a \cdot z}{z}}}\]
    7. Using strategy rm
    8. Applied pow111.7

      \[\leadsto \frac{x}{t - a \cdot z} - y \cdot \color{blue}{{\left(\frac{1}{\frac{t - a \cdot z}{z}}\right)}^{1}}\]
    9. Applied pow111.7

      \[\leadsto \frac{x}{t - a \cdot z} - \color{blue}{{y}^{1}} \cdot {\left(\frac{1}{\frac{t - a \cdot z}{z}}\right)}^{1}\]
    10. Applied pow-prod-down11.7

      \[\leadsto \frac{x}{t - a \cdot z} - \color{blue}{{\left(y \cdot \frac{1}{\frac{t - a \cdot z}{z}}\right)}^{1}}\]
    11. Simplified2.8

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

    if -2.147501379453681e-37 < z < 6.971341247317711e-63

    1. Initial program 0.1

      \[\frac{x - y \cdot z}{t - a \cdot z}\]
    2. Taylor expanded around inf 0.1

      \[\leadsto \frac{x - y \cdot z}{\color{blue}{t - a \cdot z}}\]
    3. Simplified0.1

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

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

Reproduce

herbie shell --seed 2019350 +o rules:numerics
(FPCore (x y z t a)
  :name "Diagrams.Solve.Tridiagonal:solveTriDiagonal from diagrams-solve-0.1, A"
  :precision binary64

  :herbie-target
  (if (< z -32113435955957344) (- (/ x (- t (* a z))) (/ y (- (/ t z) a))) (if (< z 3.5139522372978296e-86) (* (- x (* y z)) (/ 1 (- t (* a z)))) (- (/ x (- t (* a z))) (/ y (- (/ t z) a)))))

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