Average Error: 10.2 → 1.7
Time: 17.4s
Precision: 64
\[\frac{x - y \cdot z}{t - a \cdot z}\]
\[\begin{array}{l} \mathbf{if}\;z \le -1.708669844034143104779954053188589791328 \cdot 10^{-77} \lor \neg \left(z \le 3.259834138576097495928643858178955521283 \cdot 10^{-62}\right):\\ \;\;\;\;\frac{x}{\mathsf{fma}\left(a, -z, t\right)} - \frac{y}{\frac{t}{z} - a}\\ \mathbf{else}:\\ \;\;\;\;\left(x - y \cdot z\right) \cdot \frac{1}{\mathsf{fma}\left(a, -z, t\right)}\\ \end{array}\]
\frac{x - y \cdot z}{t - a \cdot z}
\begin{array}{l}
\mathbf{if}\;z \le -1.708669844034143104779954053188589791328 \cdot 10^{-77} \lor \neg \left(z \le 3.259834138576097495928643858178955521283 \cdot 10^{-62}\right):\\
\;\;\;\;\frac{x}{\mathsf{fma}\left(a, -z, t\right)} - \frac{y}{\frac{t}{z} - a}\\

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

\end{array}
double f(double x, double y, double z, double t, double a) {
        double r553785 = x;
        double r553786 = y;
        double r553787 = z;
        double r553788 = r553786 * r553787;
        double r553789 = r553785 - r553788;
        double r553790 = t;
        double r553791 = a;
        double r553792 = r553791 * r553787;
        double r553793 = r553790 - r553792;
        double r553794 = r553789 / r553793;
        return r553794;
}

double f(double x, double y, double z, double t, double a) {
        double r553795 = z;
        double r553796 = -1.7086698440341431e-77;
        bool r553797 = r553795 <= r553796;
        double r553798 = 3.2598341385760975e-62;
        bool r553799 = r553795 <= r553798;
        double r553800 = !r553799;
        bool r553801 = r553797 || r553800;
        double r553802 = x;
        double r553803 = a;
        double r553804 = -r553795;
        double r553805 = t;
        double r553806 = fma(r553803, r553804, r553805);
        double r553807 = r553802 / r553806;
        double r553808 = y;
        double r553809 = r553805 / r553795;
        double r553810 = r553809 - r553803;
        double r553811 = r553808 / r553810;
        double r553812 = r553807 - r553811;
        double r553813 = r553808 * r553795;
        double r553814 = r553802 - r553813;
        double r553815 = 1.0;
        double r553816 = r553815 / r553806;
        double r553817 = r553814 * r553816;
        double r553818 = r553801 ? r553812 : r553817;
        return r553818;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original10.2
Target1.7
Herbie1.7
\[\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 < -1.7086698440341431e-77 or 3.2598341385760975e-62 < z

    1. Initial program 16.6

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

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

      \[\leadsto \left(x - y \cdot z\right) \cdot \color{blue}{\frac{1}{\mathsf{fma}\left(a, -z, t\right)}}\]
    5. Using strategy rm
    6. Applied associate-*r/16.6

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

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

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

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

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

    if -1.7086698440341431e-77 < z < 3.2598341385760975e-62

    1. Initial program 0.1

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -1.708669844034143104779954053188589791328 \cdot 10^{-77} \lor \neg \left(z \le 3.259834138576097495928643858178955521283 \cdot 10^{-62}\right):\\ \;\;\;\;\frac{x}{\mathsf{fma}\left(a, -z, t\right)} - \frac{y}{\frac{t}{z} - a}\\ \mathbf{else}:\\ \;\;\;\;\left(x - y \cdot z\right) \cdot \frac{1}{\mathsf{fma}\left(a, -z, t\right)}\\ \end{array}\]

Reproduce

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

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

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