Average Error: 16.5 → 15.8
Time: 21.2s
Precision: 64
\[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
\[\begin{array}{l} \mathbf{if}\;t \le 3.6240631720595186 \cdot 10^{+86}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(1.0 + a\right) + \left(y \cdot b\right) \cdot \frac{1}{t}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\frac{y \cdot b}{t} + \left(1.0 + a\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}\;t \le 3.6240631720595186 \cdot 10^{+86}:\\
\;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(1.0 + a\right) + \left(y \cdot b\right) \cdot \frac{1}{t}}\\

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r33083423 = x;
        double r33083424 = y;
        double r33083425 = z;
        double r33083426 = r33083424 * r33083425;
        double r33083427 = t;
        double r33083428 = r33083426 / r33083427;
        double r33083429 = r33083423 + r33083428;
        double r33083430 = a;
        double r33083431 = 1.0;
        double r33083432 = r33083430 + r33083431;
        double r33083433 = b;
        double r33083434 = r33083424 * r33083433;
        double r33083435 = r33083434 / r33083427;
        double r33083436 = r33083432 + r33083435;
        double r33083437 = r33083429 / r33083436;
        return r33083437;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r33083438 = t;
        double r33083439 = 3.6240631720595186e+86;
        bool r33083440 = r33083438 <= r33083439;
        double r33083441 = x;
        double r33083442 = y;
        double r33083443 = z;
        double r33083444 = r33083442 * r33083443;
        double r33083445 = r33083444 / r33083438;
        double r33083446 = r33083441 + r33083445;
        double r33083447 = 1.0;
        double r33083448 = a;
        double r33083449 = r33083447 + r33083448;
        double r33083450 = b;
        double r33083451 = r33083442 * r33083450;
        double r33083452 = 1.0;
        double r33083453 = r33083452 / r33083438;
        double r33083454 = r33083451 * r33083453;
        double r33083455 = r33083449 + r33083454;
        double r33083456 = r33083446 / r33083455;
        double r33083457 = r33083443 / r33083438;
        double r33083458 = fma(r33083457, r33083442, r33083441);
        double r33083459 = r33083451 / r33083438;
        double r33083460 = r33083459 + r33083449;
        double r33083461 = r33083458 / r33083460;
        double r33083462 = r33083440 ? r33083456 : r33083461;
        return r33083462;
}

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.5
Target13.4
Herbie15.8
\[\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 t < 3.6240631720595186e+86

    1. Initial program 17.5

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
    2. Using strategy rm
    3. Applied div-inv17.5

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

    if 3.6240631720595186e+86 < t

    1. Initial program 12.1

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
    2. Taylor expanded around 0 12.1

      \[\leadsto \frac{\color{blue}{\frac{z \cdot y}{t} + x}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
    3. Simplified8.5

      \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification15.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;t \le 3.6240631720595186 \cdot 10^{+86}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(1.0 + a\right) + \left(y \cdot b\right) \cdot \frac{1}{t}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\frac{y \cdot b}{t} + \left(1.0 + a\right)}\\ \end{array}\]

Reproduce

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