Average Error: 16.4 → 12.8
Time: 12.3s
Precision: 64
\[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\]
\[\begin{array}{l} \mathbf{if}\;t \le -68868865494452635959296 \lor \neg \left(t \le 1.217919208020054508540242037506414565954 \cdot 10^{-40}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1}\\ \mathbf{else}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\\ \end{array}\]
\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}
\begin{array}{l}
\mathbf{if}\;t \le -68868865494452635959296 \lor \neg \left(t \le 1.217919208020054508540242037506414565954 \cdot 10^{-40}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1}\\

\mathbf{else}:\\
\;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\\

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r934759 = x;
        double r934760 = y;
        double r934761 = z;
        double r934762 = r934760 * r934761;
        double r934763 = t;
        double r934764 = r934762 / r934763;
        double r934765 = r934759 + r934764;
        double r934766 = a;
        double r934767 = 1.0;
        double r934768 = r934766 + r934767;
        double r934769 = b;
        double r934770 = r934760 * r934769;
        double r934771 = r934770 / r934763;
        double r934772 = r934768 + r934771;
        double r934773 = r934765 / r934772;
        return r934773;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r934774 = t;
        double r934775 = -6.886886549445264e+22;
        bool r934776 = r934774 <= r934775;
        double r934777 = 1.2179192080200545e-40;
        bool r934778 = r934774 <= r934777;
        double r934779 = !r934778;
        bool r934780 = r934776 || r934779;
        double r934781 = y;
        double r934782 = r934781 / r934774;
        double r934783 = z;
        double r934784 = x;
        double r934785 = fma(r934782, r934783, r934784);
        double r934786 = 1.0;
        double r934787 = b;
        double r934788 = a;
        double r934789 = fma(r934782, r934787, r934788);
        double r934790 = 1.0;
        double r934791 = r934789 + r934790;
        double r934792 = r934786 / r934791;
        double r934793 = r934785 * r934792;
        double r934794 = r934781 * r934783;
        double r934795 = r934794 / r934774;
        double r934796 = r934784 + r934795;
        double r934797 = r934788 + r934790;
        double r934798 = r934781 * r934787;
        double r934799 = r934798 / r934774;
        double r934800 = r934797 + r934799;
        double r934801 = r934796 / r934800;
        double r934802 = r934780 ? r934793 : r934801;
        return r934802;
}

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.4
Target13.0
Herbie12.8
\[\begin{array}{l} \mathbf{if}\;t \lt -1.365908536631008841640163147697088508132 \cdot 10^{-271}:\\ \;\;\;\;1 \cdot \left(\left(x + \frac{y}{t} \cdot z\right) \cdot \frac{1}{\left(a + 1\right) + \frac{y}{t} \cdot b}\right)\\ \mathbf{elif}\;t \lt 3.036967103737245906066829435890093573122 \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\right) + \frac{y}{t} \cdot b}\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if t < -6.886886549445264e+22 or 1.2179192080200545e-40 < t

    1. Initial program 11.1

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\]
    2. Simplified4.3

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

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

    if -6.886886549445264e+22 < t < 1.2179192080200545e-40

    1. Initial program 22.2

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

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

Reproduce

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

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

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