Average Error: 16.3 → 12.8
Time: 19.9s
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 -6.250985929191756168944543810127106716888 \cdot 10^{-15}:\\ \;\;\;\;\frac{x + \frac{y}{t} \cdot z}{\mathsf{fma}\left(\frac{y}{t}, b, 1 + a\right)}\\ \mathbf{elif}\;t \le 9.963354697681221136350955033362107430929 \cdot 10^{-228}:\\ \;\;\;\;\frac{\frac{y \cdot z}{t} + x}{\frac{y \cdot b}{t} + \left(1 + a\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{x + \frac{y}{t} \cdot z}{\mathsf{fma}\left(\frac{y}{t}, b, 1 + a\right)}\\ \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 -6.250985929191756168944543810127106716888 \cdot 10^{-15}:\\
\;\;\;\;\frac{x + \frac{y}{t} \cdot z}{\mathsf{fma}\left(\frac{y}{t}, b, 1 + a\right)}\\

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

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r33666056 = x;
        double r33666057 = y;
        double r33666058 = z;
        double r33666059 = r33666057 * r33666058;
        double r33666060 = t;
        double r33666061 = r33666059 / r33666060;
        double r33666062 = r33666056 + r33666061;
        double r33666063 = a;
        double r33666064 = 1.0;
        double r33666065 = r33666063 + r33666064;
        double r33666066 = b;
        double r33666067 = r33666057 * r33666066;
        double r33666068 = r33666067 / r33666060;
        double r33666069 = r33666065 + r33666068;
        double r33666070 = r33666062 / r33666069;
        return r33666070;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r33666071 = t;
        double r33666072 = -6.250985929191756e-15;
        bool r33666073 = r33666071 <= r33666072;
        double r33666074 = x;
        double r33666075 = y;
        double r33666076 = r33666075 / r33666071;
        double r33666077 = z;
        double r33666078 = r33666076 * r33666077;
        double r33666079 = r33666074 + r33666078;
        double r33666080 = b;
        double r33666081 = 1.0;
        double r33666082 = a;
        double r33666083 = r33666081 + r33666082;
        double r33666084 = fma(r33666076, r33666080, r33666083);
        double r33666085 = r33666079 / r33666084;
        double r33666086 = 9.963354697681221e-228;
        bool r33666087 = r33666071 <= r33666086;
        double r33666088 = r33666075 * r33666077;
        double r33666089 = r33666088 / r33666071;
        double r33666090 = r33666089 + r33666074;
        double r33666091 = r33666075 * r33666080;
        double r33666092 = r33666091 / r33666071;
        double r33666093 = r33666092 + r33666083;
        double r33666094 = r33666090 / r33666093;
        double r33666095 = r33666087 ? r33666094 : r33666085;
        double r33666096 = r33666073 ? r33666085 : r33666095;
        return r33666096;
}

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.3
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.250985929191756e-15 or 9.963354697681221e-228 < t

    1. Initial program 13.4

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

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

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

    if -6.250985929191756e-15 < t < 9.963354697681221e-228

    1. Initial program 23.5

      \[\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 -6.250985929191756168944543810127106716888 \cdot 10^{-15}:\\ \;\;\;\;\frac{x + \frac{y}{t} \cdot z}{\mathsf{fma}\left(\frac{y}{t}, b, 1 + a\right)}\\ \mathbf{elif}\;t \le 9.963354697681221136350955033362107430929 \cdot 10^{-228}:\\ \;\;\;\;\frac{\frac{y \cdot z}{t} + x}{\frac{y \cdot b}{t} + \left(1 + a\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{x + \frac{y}{t} \cdot z}{\mathsf{fma}\left(\frac{y}{t}, b, 1 + a\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2019170 +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.0 (* (+ x (* (/ y t) z)) (/ 1.0 (+ (+ a 1.0) (* (/ y t) b))))) (if (< t 3.036967103737246e-130) (/ z b) (* 1.0 (* (+ x (* (/ y t) z)) (/ 1.0 (+ (+ a 1.0) (* (/ y t) b)))))))

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