Average Error: 17.2 → 14.7
Time: 17.9s
Precision: 64
\[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\]
\[\begin{array}{l} \mathbf{if}\;y \le -1.037047087222453891369496787419045601224 \cdot 10^{74}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1} \cdot \mathsf{fma}\left(\frac{z}{t}, y, x\right)\\ \mathbf{elif}\;y \le 1.182148707119317392556015426800521414227 \cdot 10^{65}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1} \cdot \mathsf{fma}\left(\frac{z}{t}, y, x\right)\\ \end{array}\]
\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}
\begin{array}{l}
\mathbf{if}\;y \le -1.037047087222453891369496787419045601224 \cdot 10^{74}:\\
\;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1} \cdot \mathsf{fma}\left(\frac{z}{t}, y, x\right)\\

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

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r28464658 = x;
        double r28464659 = y;
        double r28464660 = z;
        double r28464661 = r28464659 * r28464660;
        double r28464662 = t;
        double r28464663 = r28464661 / r28464662;
        double r28464664 = r28464658 + r28464663;
        double r28464665 = a;
        double r28464666 = 1.0;
        double r28464667 = r28464665 + r28464666;
        double r28464668 = b;
        double r28464669 = r28464659 * r28464668;
        double r28464670 = r28464669 / r28464662;
        double r28464671 = r28464667 + r28464670;
        double r28464672 = r28464664 / r28464671;
        return r28464672;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r28464673 = y;
        double r28464674 = -1.0370470872224539e+74;
        bool r28464675 = r28464673 <= r28464674;
        double r28464676 = 1.0;
        double r28464677 = t;
        double r28464678 = r28464673 / r28464677;
        double r28464679 = b;
        double r28464680 = a;
        double r28464681 = fma(r28464678, r28464679, r28464680);
        double r28464682 = 1.0;
        double r28464683 = r28464681 + r28464682;
        double r28464684 = r28464676 / r28464683;
        double r28464685 = z;
        double r28464686 = r28464685 / r28464677;
        double r28464687 = x;
        double r28464688 = fma(r28464686, r28464673, r28464687);
        double r28464689 = r28464684 * r28464688;
        double r28464690 = 1.1821487071193174e+65;
        bool r28464691 = r28464673 <= r28464690;
        double r28464692 = r28464685 * r28464673;
        double r28464693 = r28464692 / r28464677;
        double r28464694 = r28464693 + r28464687;
        double r28464695 = r28464679 * r28464673;
        double r28464696 = r28464695 / r28464677;
        double r28464697 = r28464680 + r28464682;
        double r28464698 = r28464696 + r28464697;
        double r28464699 = r28464694 / r28464698;
        double r28464700 = r28464691 ? r28464699 : r28464689;
        double r28464701 = r28464675 ? r28464689 : r28464700;
        return r28464701;
}

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

Original17.2
Target13.7
Herbie14.7
\[\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 y < -1.0370470872224539e+74 or 1.1821487071193174e+65 < y

    1. Initial program 35.2

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

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

      \[\leadsto \frac{\mathsf{fma}\left(\frac{z}{t}, y, x\right)}{\color{blue}{y \cdot \frac{b}{t} + \left(a + 1\right)}}\]
    5. Taylor expanded around 0 31.0

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

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

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

    if -1.0370470872224539e+74 < y < 1.1821487071193174e+65

    1. Initial program 6.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 simplification14.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \le -1.037047087222453891369496787419045601224 \cdot 10^{74}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1} \cdot \mathsf{fma}\left(\frac{z}{t}, y, x\right)\\ \mathbf{elif}\;y \le 1.182148707119317392556015426800521414227 \cdot 10^{65}:\\ \;\;\;\;\frac{\frac{z \cdot y}{t} + x}{\frac{b \cdot y}{t} + \left(a + 1\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\mathsf{fma}\left(\frac{y}{t}, b, a\right) + 1} \cdot \mathsf{fma}\left(\frac{z}{t}, y, x\right)\\ \end{array}\]

Reproduce

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