\frac{x - y \cdot z}{t - a \cdot z}\begin{array}{l}
\mathbf{if}\;z \le -1.708669844034143104779954053188589791328 \cdot 10^{-77} \lor \neg \left(z \le 3.259834138576097495928643858178955521283 \cdot 10^{-62}\right):\\
\;\;\;\;\frac{x}{\mathsf{fma}\left(a, -z, t\right)} - \frac{y}{\frac{t}{z} - a}\\
\mathbf{else}:\\
\;\;\;\;\left(x - y \cdot z\right) \cdot \frac{1}{\mathsf{fma}\left(a, -z, t\right)}\\
\end{array}double f(double x, double y, double z, double t, double a) {
double r553785 = x;
double r553786 = y;
double r553787 = z;
double r553788 = r553786 * r553787;
double r553789 = r553785 - r553788;
double r553790 = t;
double r553791 = a;
double r553792 = r553791 * r553787;
double r553793 = r553790 - r553792;
double r553794 = r553789 / r553793;
return r553794;
}
double f(double x, double y, double z, double t, double a) {
double r553795 = z;
double r553796 = -1.7086698440341431e-77;
bool r553797 = r553795 <= r553796;
double r553798 = 3.2598341385760975e-62;
bool r553799 = r553795 <= r553798;
double r553800 = !r553799;
bool r553801 = r553797 || r553800;
double r553802 = x;
double r553803 = a;
double r553804 = -r553795;
double r553805 = t;
double r553806 = fma(r553803, r553804, r553805);
double r553807 = r553802 / r553806;
double r553808 = y;
double r553809 = r553805 / r553795;
double r553810 = r553809 - r553803;
double r553811 = r553808 / r553810;
double r553812 = r553807 - r553811;
double r553813 = r553808 * r553795;
double r553814 = r553802 - r553813;
double r553815 = 1.0;
double r553816 = r553815 / r553806;
double r553817 = r553814 * r553816;
double r553818 = r553801 ? r553812 : r553817;
return r553818;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a
| Original | 10.2 |
|---|---|
| Target | 1.7 |
| Herbie | 1.7 |
if z < -1.7086698440341431e-77 or 3.2598341385760975e-62 < z Initial program 16.6
rmApplied div-inv16.7
Simplified16.7
rmApplied associate-*r/16.6
Simplified16.6
rmApplied div-sub16.6
Simplified10.7
Taylor expanded around 0 2.5
if -1.7086698440341431e-77 < z < 3.2598341385760975e-62Initial program 0.1
rmApplied div-inv0.3
Simplified0.3
Final simplification1.7
herbie shell --seed 2019194 +o rules:numerics
(FPCore (x y z t a)
:name "Diagrams.Solve.Tridiagonal:solveTriDiagonal from diagrams-solve-0.1, A"
:herbie-target
(if (< z -32113435955957344.0) (- (/ x (- t (* a z))) (/ y (- (/ t z) a))) (if (< z 3.5139522372978296e-86) (* (- x (* y z)) (/ 1.0 (- t (* a z)))) (- (/ x (- t (* a z))) (/ y (- (/ t z) a)))))
(/ (- x (* y z)) (- t (* a z))))