Average Error: 16.2 → 13.0
Time: 13.7s
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} \lor \neg \left(t \le 4.3949365662468338 \cdot 10^{-8}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}\\ \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 -1.2730664839585871 \cdot 10^{-178} \lor \neg \left(t \le 4.3949365662468338 \cdot 10^{-8}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}\\

\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 r755073 = x;
        double r755074 = y;
        double r755075 = z;
        double r755076 = r755074 * r755075;
        double r755077 = t;
        double r755078 = r755076 / r755077;
        double r755079 = r755073 + r755078;
        double r755080 = a;
        double r755081 = 1.0;
        double r755082 = r755080 + r755081;
        double r755083 = b;
        double r755084 = r755074 * r755083;
        double r755085 = r755084 / r755077;
        double r755086 = r755082 + r755085;
        double r755087 = r755079 / r755086;
        return r755087;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r755088 = t;
        double r755089 = -1.273066483958587e-178;
        bool r755090 = r755088 <= r755089;
        double r755091 = 4.394936566246834e-08;
        bool r755092 = r755088 <= r755091;
        double r755093 = !r755092;
        bool r755094 = r755090 || r755093;
        double r755095 = y;
        double r755096 = r755095 / r755088;
        double r755097 = z;
        double r755098 = x;
        double r755099 = fma(r755096, r755097, r755098);
        double r755100 = 1.0;
        double r755101 = 1.0;
        double r755102 = b;
        double r755103 = a;
        double r755104 = fma(r755096, r755102, r755103);
        double r755105 = r755101 + r755104;
        double r755106 = r755100 / r755105;
        double r755107 = r755099 * r755106;
        double r755108 = r755095 * r755097;
        double r755109 = r755108 / r755088;
        double r755110 = r755098 + r755109;
        double r755111 = r755103 + r755101;
        double r755112 = r755095 * r755102;
        double r755113 = r755112 / r755088;
        double r755114 = r755111 + r755113;
        double r755115 = r755110 / r755114;
        double r755116 = r755094 ? r755107 : r755115;
        return r755116;
}

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.0
\[\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 2 regimes
  2. if t < -1.273066483958587e-178 or 4.394936566246834e-08 < t

    1. Initial program 12.1

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

      \[\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-inv7.3

      \[\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 < 4.394936566246834e-08

    1. Initial program 24.6

      \[\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 simplification13.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;t \le -1.2730664839585871 \cdot 10^{-178} \lor \neg \left(t \le 4.3949365662468338 \cdot 10^{-8}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{t}, z, x\right) \cdot \frac{1}{1 + \mathsf{fma}\left(\frac{y}{t}, b, a\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}\\ \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))))