\frac{x - y \cdot z}{t - a \cdot z}\begin{array}{l}
\mathbf{if}\;z \le -2.147501379453681047725513588483459387151 \cdot 10^{-37} \lor \neg \left(z \le 6.9713412473177113437097495394906217014 \cdot 10^{-63}\right):\\
\;\;\;\;\frac{x}{t - a \cdot z} - \frac{y}{\frac{t}{z} - a}\\
\mathbf{else}:\\
\;\;\;\;\frac{x - y \cdot z}{\mathsf{fma}\left(-z, a, t\right)}\\
\end{array}double f(double x, double y, double z, double t, double a) {
double r933570 = x;
double r933571 = y;
double r933572 = z;
double r933573 = r933571 * r933572;
double r933574 = r933570 - r933573;
double r933575 = t;
double r933576 = a;
double r933577 = r933576 * r933572;
double r933578 = r933575 - r933577;
double r933579 = r933574 / r933578;
return r933579;
}
double f(double x, double y, double z, double t, double a) {
double r933580 = z;
double r933581 = -2.147501379453681e-37;
bool r933582 = r933580 <= r933581;
double r933583 = 6.971341247317711e-63;
bool r933584 = r933580 <= r933583;
double r933585 = !r933584;
bool r933586 = r933582 || r933585;
double r933587 = x;
double r933588 = t;
double r933589 = a;
double r933590 = r933589 * r933580;
double r933591 = r933588 - r933590;
double r933592 = r933587 / r933591;
double r933593 = y;
double r933594 = r933588 / r933580;
double r933595 = r933594 - r933589;
double r933596 = r933593 / r933595;
double r933597 = r933592 - r933596;
double r933598 = r933593 * r933580;
double r933599 = r933587 - r933598;
double r933600 = -r933580;
double r933601 = fma(r933600, r933589, r933588);
double r933602 = r933599 / r933601;
double r933603 = r933586 ? r933597 : r933602;
return r933603;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a
| Original | 10.3 |
|---|---|
| Target | 1.8 |
| Herbie | 1.6 |
if z < -2.147501379453681e-37 or 6.971341247317711e-63 < z Initial program 17.8
rmApplied div-sub17.8
Simplified11.6
rmApplied clear-num11.7
rmApplied pow111.7
Applied pow111.7
Applied pow-prod-down11.7
Simplified2.8
if -2.147501379453681e-37 < z < 6.971341247317711e-63Initial program 0.1
Taylor expanded around inf 0.1
Simplified0.1
Final simplification1.6
herbie shell --seed 2019350 +o rules:numerics
(FPCore (x y z t a)
:name "Diagrams.Solve.Tridiagonal:solveTriDiagonal from diagrams-solve-0.1, A"
:precision binary64
:herbie-target
(if (< z -32113435955957344) (- (/ x (- t (* a z))) (/ y (- (/ t z) a))) (if (< z 3.5139522372978296e-86) (* (- x (* y z)) (/ 1 (- t (* a z)))) (- (/ x (- t (* a z))) (/ y (- (/ t z) a)))))
(/ (- x (* y z)) (- t (* a z))))