Average Error: 16.0 → 12.6
Time: 1.4m
Precision: 64
\[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
\[\begin{array}{l} \mathbf{if}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.726406946855666 \cdot 10^{+238}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.7605438012672034 \cdot 10^{-260}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 1.3135635701590148 \cdot 10^{-257}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 7.061941886181377 \cdot 10^{+145}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \end{array}\]
\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}
\begin{array}{l}
\mathbf{if}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.726406946855666 \cdot 10^{+238}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\

\mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.7605438012672034 \cdot 10^{-260}:\\
\;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\

\mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 1.3135635701590148 \cdot 10^{-257}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\

\mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 7.061941886181377 \cdot 10^{+145}:\\
\;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r34349754 = x;
        double r34349755 = y;
        double r34349756 = z;
        double r34349757 = r34349755 * r34349756;
        double r34349758 = t;
        double r34349759 = r34349757 / r34349758;
        double r34349760 = r34349754 + r34349759;
        double r34349761 = a;
        double r34349762 = 1.0;
        double r34349763 = r34349761 + r34349762;
        double r34349764 = b;
        double r34349765 = r34349755 * r34349764;
        double r34349766 = r34349765 / r34349758;
        double r34349767 = r34349763 + r34349766;
        double r34349768 = r34349760 / r34349767;
        return r34349768;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r34349769 = z;
        double r34349770 = y;
        double r34349771 = r34349769 * r34349770;
        double r34349772 = t;
        double r34349773 = r34349771 / r34349772;
        double r34349774 = x;
        double r34349775 = r34349773 + r34349774;
        double r34349776 = b;
        double r34349777 = r34349776 * r34349770;
        double r34349778 = r34349777 / r34349772;
        double r34349779 = a;
        double r34349780 = 1.0;
        double r34349781 = r34349779 + r34349780;
        double r34349782 = r34349778 + r34349781;
        double r34349783 = r34349775 / r34349782;
        double r34349784 = -1.726406946855666e+238;
        bool r34349785 = r34349783 <= r34349784;
        double r34349786 = r34349769 / r34349772;
        double r34349787 = fma(r34349786, r34349770, r34349774);
        double r34349788 = r34349770 / r34349772;
        double r34349789 = fma(r34349788, r34349776, r34349781);
        double r34349790 = r34349787 / r34349789;
        double r34349791 = -1.7605438012672034e-260;
        bool r34349792 = r34349783 <= r34349791;
        double r34349793 = 1.3135635701590148e-257;
        bool r34349794 = r34349783 <= r34349793;
        double r34349795 = 7.061941886181377e+145;
        bool r34349796 = r34349783 <= r34349795;
        double r34349797 = r34349796 ? r34349783 : r34349790;
        double r34349798 = r34349794 ? r34349790 : r34349797;
        double r34349799 = r34349792 ? r34349783 : r34349798;
        double r34349800 = r34349785 ? r34349790 : r34349799;
        return r34349800;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Bits error versus b

Target

Original16.0
Target13.2
Herbie12.6
\[\begin{array}{l} \mathbf{if}\;t \lt -1.3659085366310088 \cdot 10^{-271}:\\ \;\;\;\;1 \cdot \left(\left(x + \frac{y}{t} \cdot z\right) \cdot \frac{1}{\left(a + 1.0\right) + \frac{y}{t} \cdot b}\right)\\ \mathbf{elif}\;t \lt 3.036967103737246 \cdot 10^{-130}:\\ \;\;\;\;\frac{z}{b}\\ \mathbf{else}:\\ \;\;\;\;1 \cdot \left(\left(x + \frac{y}{t} \cdot z\right) \cdot \frac{1}{\left(a + 1.0\right) + \frac{y}{t} \cdot b}\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))) < -1.726406946855666e+238 or -1.7605438012672034e-260 < (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))) < 1.3135635701590148e-257 or 7.061941886181377e+145 < (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t)))

    1. Initial program 34.5

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
    2. Simplified27.6

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

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

      \[\leadsto \color{blue}{\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot 1}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}}\]
    7. Simplified27.2

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

    if -1.726406946855666e+238 < (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))) < -1.7605438012672034e-260 or 1.3135635701590148e-257 < (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))) < 7.061941886181377e+145

    1. Initial program 0.4

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification12.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.726406946855666 \cdot 10^{+238}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le -1.7605438012672034 \cdot 10^{-260}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 1.3135635701590148 \cdot 10^{-257}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \mathbf{elif}\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)} \le 7.061941886181377 \cdot 10^{+145}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1.0\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, a + 1.0\right)}\\ \end{array}\]

Reproduce

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

  :herbie-target
  (if (< t -1.3659085366310088e-271) (* 1 (* (+ x (* (/ y t) z)) (/ 1 (+ (+ a 1.0) (* (/ y t) b))))) (if (< t 3.036967103737246e-130) (/ z b) (* 1 (* (+ x (* (/ y t) z)) (/ 1 (+ (+ a 1.0) (* (/ y t) b)))))))

  (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))))