Average Error: 16.2 → 13.2
Time: 11.5s
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 -1.2730664839585871 \cdot 10^{-178}:\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}\\ \mathbf{elif}\;t \le 8.29955366965115091 \cdot 10^{-51}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\frac{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}{\frac{z}{t} \cdot y + x}}\\ \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 -1.2730664839585871 \cdot 10^{-178}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}\\

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

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r894266 = x;
        double r894267 = y;
        double r894268 = z;
        double r894269 = r894267 * r894268;
        double r894270 = t;
        double r894271 = r894269 / r894270;
        double r894272 = r894266 + r894271;
        double r894273 = a;
        double r894274 = 1.0;
        double r894275 = r894273 + r894274;
        double r894276 = b;
        double r894277 = r894267 * r894276;
        double r894278 = r894277 / r894270;
        double r894279 = r894275 + r894278;
        double r894280 = r894272 / r894279;
        return r894280;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r894281 = t;
        double r894282 = -1.273066483958587e-178;
        bool r894283 = r894281 <= r894282;
        double r894284 = y;
        double r894285 = r894284 / r894281;
        double r894286 = z;
        double r894287 = x;
        double r894288 = fma(r894285, r894286, r894287);
        double r894289 = 1.0;
        double r894290 = 1.0;
        double r894291 = b;
        double r894292 = a;
        double r894293 = fma(r894285, r894291, r894292);
        double r894294 = r894290 + r894293;
        double r894295 = r894289 / r894294;
        double r894296 = r894288 * r894295;
        double r894297 = 8.299553669651151e-51;
        bool r894298 = r894281 <= r894297;
        double r894299 = r894284 * r894286;
        double r894300 = r894299 / r894281;
        double r894301 = r894287 + r894300;
        double r894302 = r894292 + r894290;
        double r894303 = r894284 * r894291;
        double r894304 = r894303 / r894281;
        double r894305 = r894302 + r894304;
        double r894306 = r894301 / r894305;
        double r894307 = r894286 / r894281;
        double r894308 = r894307 * r894284;
        double r894309 = r894308 + r894287;
        double r894310 = r894294 / r894309;
        double r894311 = r894289 / r894310;
        double r894312 = r894298 ? r894306 : r894311;
        double r894313 = r894283 ? r894296 : r894312;
        return r894313;
}

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.2
Target13.2
Herbie13.2
\[\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\right) + \frac{y}{t} \cdot b}\right)\\ \mathbf{elif}\;t \lt 3.0369671037372459 \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 3 regimes
  2. if t < -1.273066483958587e-178

    1. Initial program 12.3

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

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

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

    if -1.273066483958587e-178 < t < 8.299553669651151e-51

    1. Initial program 25.9

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

    if 8.299553669651151e-51 < t

    1. Initial program 11.8

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

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

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

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

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

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

Reproduce

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