Average Error: 11.0 → 8.0
Time: 15.6s
Precision: 64
\[\frac{x - y \cdot z}{t - a \cdot z}\]
\[\begin{array}{l} \mathbf{if}\;\frac{x - z \cdot y}{t - a \cdot z} \le -1.341427406791736534539647356100824094756 \cdot 10^{-264} \lor \neg \left(\frac{x - z \cdot y}{t - a \cdot z} \le 0.0\right):\\ \;\;\;\;\frac{x - z \cdot y}{t - a \cdot z}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\frac{t}{\mathsf{fma}\left(z, -y, x\right)} - z \cdot \frac{a}{\mathsf{fma}\left(z, -y, x\right)}}\\ \end{array}\]
\frac{x - y \cdot z}{t - a \cdot z}
\begin{array}{l}
\mathbf{if}\;\frac{x - z \cdot y}{t - a \cdot z} \le -1.341427406791736534539647356100824094756 \cdot 10^{-264} \lor \neg \left(\frac{x - z \cdot y}{t - a \cdot z} \le 0.0\right):\\
\;\;\;\;\frac{x - z \cdot y}{t - a \cdot z}\\

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

\end{array}
double f(double x, double y, double z, double t, double a) {
        double r430658 = x;
        double r430659 = y;
        double r430660 = z;
        double r430661 = r430659 * r430660;
        double r430662 = r430658 - r430661;
        double r430663 = t;
        double r430664 = a;
        double r430665 = r430664 * r430660;
        double r430666 = r430663 - r430665;
        double r430667 = r430662 / r430666;
        return r430667;
}

double f(double x, double y, double z, double t, double a) {
        double r430668 = x;
        double r430669 = z;
        double r430670 = y;
        double r430671 = r430669 * r430670;
        double r430672 = r430668 - r430671;
        double r430673 = t;
        double r430674 = a;
        double r430675 = r430674 * r430669;
        double r430676 = r430673 - r430675;
        double r430677 = r430672 / r430676;
        double r430678 = -1.3414274067917365e-264;
        bool r430679 = r430677 <= r430678;
        double r430680 = 0.0;
        bool r430681 = r430677 <= r430680;
        double r430682 = !r430681;
        bool r430683 = r430679 || r430682;
        double r430684 = 1.0;
        double r430685 = -r430670;
        double r430686 = fma(r430669, r430685, r430668);
        double r430687 = r430673 / r430686;
        double r430688 = r430674 / r430686;
        double r430689 = r430669 * r430688;
        double r430690 = r430687 - r430689;
        double r430691 = r430684 / r430690;
        double r430692 = r430683 ? r430677 : r430691;
        return r430692;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original11.0
Target1.7
Herbie8.0
\[\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 (/ (- x (* y z)) (- t (* a z))) < -1.3414274067917365e-264 or 0.0 < (/ (- x (* y z)) (- t (* a z)))

    1. Initial program 8.7

      \[\frac{x - y \cdot z}{t - a \cdot z}\]

    if -1.3414274067917365e-264 < (/ (- x (* y z)) (- t (* a z))) < 0.0

    1. Initial program 22.5

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

      \[\leadsto \color{blue}{\frac{1}{\frac{t - a \cdot z}{x - y \cdot z}}}\]
    4. Simplified23.0

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

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

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

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

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

Reproduce

herbie shell --seed 2019174 +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))))