\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;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a




Bits error versus b
| Original | 17.2 |
|---|---|
| Target | 13.7 |
| Herbie | 14.7 |
if y < -1.0370470872224539e+74 or 1.1821487071193174e+65 < y Initial program 35.2
Simplified26.1
rmApplied fma-udef26.1
Taylor expanded around 0 31.0
Simplified28.6
rmApplied div-inv28.7
if -1.0370470872224539e+74 < y < 1.1821487071193174e+65Initial program 6.5
Final simplification14.7
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))))