Average Error: 16.5 → 13.5
Time: 22.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}\;z \le -1.6665856283572759 \cdot 10^{-183}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, 1.0 + a\right)}\\ \mathbf{elif}\;z \le 2.227585327806652 \cdot 10^{-193}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\frac{b \cdot y}{t} + \left(1.0 + a\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, 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}\;z \le -1.6665856283572759 \cdot 10^{-183}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, 1.0 + a\right)}\\

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

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

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r31735089 = x;
        double r31735090 = y;
        double r31735091 = z;
        double r31735092 = r31735090 * r31735091;
        double r31735093 = t;
        double r31735094 = r31735092 / r31735093;
        double r31735095 = r31735089 + r31735094;
        double r31735096 = a;
        double r31735097 = 1.0;
        double r31735098 = r31735096 + r31735097;
        double r31735099 = b;
        double r31735100 = r31735090 * r31735099;
        double r31735101 = r31735100 / r31735093;
        double r31735102 = r31735098 + r31735101;
        double r31735103 = r31735095 / r31735102;
        return r31735103;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r31735104 = z;
        double r31735105 = -1.6665856283572759e-183;
        bool r31735106 = r31735104 <= r31735105;
        double r31735107 = y;
        double r31735108 = t;
        double r31735109 = r31735107 / r31735108;
        double r31735110 = x;
        double r31735111 = fma(r31735109, r31735104, r31735110);
        double r31735112 = b;
        double r31735113 = 1.0;
        double r31735114 = a;
        double r31735115 = r31735113 + r31735114;
        double r31735116 = fma(r31735109, r31735112, r31735115);
        double r31735117 = r31735111 / r31735116;
        double r31735118 = 2.227585327806652e-193;
        bool r31735119 = r31735104 <= r31735118;
        double r31735120 = r31735107 * r31735104;
        double r31735121 = r31735120 / r31735108;
        double r31735122 = r31735110 + r31735121;
        double r31735123 = r31735112 * r31735107;
        double r31735124 = r31735123 / r31735108;
        double r31735125 = r31735124 + r31735115;
        double r31735126 = r31735122 / r31735125;
        double r31735127 = r31735119 ? r31735126 : r31735117;
        double r31735128 = r31735106 ? r31735117 : r31735127;
        return r31735128;
}

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.1
Herbie13.5
\[\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 z < -1.6665856283572759e-183 or 2.227585327806652e-193 < z

    1. Initial program 19.0

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

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

    if -1.6665856283572759e-183 < z < 2.227585327806652e-193

    1. Initial program 6.0

      \[\frac{x + \frac{y \cdot z}{t}}{\left(a + 1.0\right) + \frac{y \cdot b}{t}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification13.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -1.6665856283572759 \cdot 10^{-183}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, 1.0 + a\right)}\\ \mathbf{elif}\;z \le 2.227585327806652 \cdot 10^{-193}:\\ \;\;\;\;\frac{x + \frac{y \cdot z}{t}}{\frac{b \cdot y}{t} + \left(1.0 + a\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{y}{t}, z, x\right)}{\mathsf{fma}\left(\frac{y}{t}, b, 1.0 + a\right)}\\ \end{array}\]

Reproduce

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