(FPCore (x y z t a b) :precision binary64 (/ (+ x (/ (* y z) t)) (+ (+ a 1.0) (/ (* y b) t))))
(FPCore (x y z t a b)
:precision binary64
(let* ((t_1 (/ (+ x (/ (* y z) t)) (+ (/ (* y b) t) (+ a 1.0))))
(t_2 (+ x (/ y (/ t z))))
(t_3 (+ (/ a t_2) (/ 1.0 t_2))))
(if (<= t_1 (- INFINITY))
(* (/ y (+ (+ a 1.0) (/ y (/ t b)))) (/ z t))
(if (<= t_1 -1e-318)
t_1
(if (<= t_1 0.0)
(pow (+ t_3 (/ (* y (/ b (fma y (/ z t) x))) t)) -1.0)
(if (<= t_1 4e+299) t_1 (pow (+ t_3 (/ b z)) -1.0)))))))double code(double x, double y, double z, double t, double a, double b) {
return (x + ((y * z) / t)) / ((a + 1.0) + ((y * b) / t));
}
double code(double x, double y, double z, double t, double a, double b) {
double t_1 = (x + ((y * z) / t)) / (((y * b) / t) + (a + 1.0));
double t_2 = x + (y / (t / z));
double t_3 = (a / t_2) + (1.0 / t_2);
double tmp;
if (t_1 <= -((double) INFINITY)) {
tmp = (y / ((a + 1.0) + (y / (t / b)))) * (z / t);
} else if (t_1 <= -1e-318) {
tmp = t_1;
} else if (t_1 <= 0.0) {
tmp = pow((t_3 + ((y * (b / fma(y, (z / t), x))) / t)), -1.0);
} else if (t_1 <= 4e+299) {
tmp = t_1;
} else {
tmp = pow((t_3 + (b / z)), -1.0);
}
return tmp;
}
function code(x, y, z, t, a, b) return Float64(Float64(x + Float64(Float64(y * z) / t)) / Float64(Float64(a + 1.0) + Float64(Float64(y * b) / t))) end
function code(x, y, z, t, a, b) t_1 = Float64(Float64(x + Float64(Float64(y * z) / t)) / Float64(Float64(Float64(y * b) / t) + Float64(a + 1.0))) t_2 = Float64(x + Float64(y / Float64(t / z))) t_3 = Float64(Float64(a / t_2) + Float64(1.0 / t_2)) tmp = 0.0 if (t_1 <= Float64(-Inf)) tmp = Float64(Float64(y / Float64(Float64(a + 1.0) + Float64(y / Float64(t / b)))) * Float64(z / t)); elseif (t_1 <= -1e-318) tmp = t_1; elseif (t_1 <= 0.0) tmp = Float64(t_3 + Float64(Float64(y * Float64(b / fma(y, Float64(z / t), x))) / t)) ^ -1.0; elseif (t_1 <= 4e+299) tmp = t_1; else tmp = Float64(t_3 + Float64(b / z)) ^ -1.0; end return tmp end
code[x_, y_, z_, t_, a_, b_] := N[(N[(x + N[(N[(y * z), $MachinePrecision] / t), $MachinePrecision]), $MachinePrecision] / N[(N[(a + 1.0), $MachinePrecision] + N[(N[(y * b), $MachinePrecision] / t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x_, y_, z_, t_, a_, b_] := Block[{t$95$1 = N[(N[(x + N[(N[(y * z), $MachinePrecision] / t), $MachinePrecision]), $MachinePrecision] / N[(N[(N[(y * b), $MachinePrecision] / t), $MachinePrecision] + N[(a + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$2 = N[(x + N[(y / N[(t / z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, Block[{t$95$3 = N[(N[(a / t$95$2), $MachinePrecision] + N[(1.0 / t$95$2), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$1, (-Infinity)], N[(N[(y / N[(N[(a + 1.0), $MachinePrecision] + N[(y / N[(t / b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(z / t), $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$1, -1e-318], t$95$1, If[LessEqual[t$95$1, 0.0], N[Power[N[(t$95$3 + N[(N[(y * N[(b / N[(y * N[(z / t), $MachinePrecision] + x), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / t), $MachinePrecision]), $MachinePrecision], -1.0], $MachinePrecision], If[LessEqual[t$95$1, 4e+299], t$95$1, N[Power[N[(t$95$3 + N[(b / z), $MachinePrecision]), $MachinePrecision], -1.0], $MachinePrecision]]]]]]]]
\frac{x + \frac{y \cdot z}{t}}{\left(a + 1\right) + \frac{y \cdot b}{t}}
\begin{array}{l}
t_1 := \frac{x + \frac{y \cdot z}{t}}{\frac{y \cdot b}{t} + \left(a + 1\right)}\\
t_2 := x + \frac{y}{\frac{t}{z}}\\
t_3 := \frac{a}{t_2} + \frac{1}{t_2}\\
\mathbf{if}\;t_1 \leq -\infty:\\
\;\;\;\;\frac{y}{\left(a + 1\right) + \frac{y}{\frac{t}{b}}} \cdot \frac{z}{t}\\
\mathbf{elif}\;t_1 \leq -1 \cdot 10^{-318}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;t_1 \leq 0:\\
\;\;\;\;{\left(t_3 + \frac{y \cdot \frac{b}{\mathsf{fma}\left(y, \frac{z}{t}, x\right)}}{t}\right)}^{-1}\\
\mathbf{elif}\;t_1 \leq 4 \cdot 10^{+299}:\\
\;\;\;\;t_1\\
\mathbf{else}:\\
\;\;\;\;{\left(t_3 + \frac{b}{z}\right)}^{-1}\\
\end{array}




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 | 16.4 |
|---|---|
| Target | 12.9 |
| Herbie | 3.7 |
if (/.f64 (+.f64 x (/.f64 (*.f64 y z) t)) (+.f64 (+.f64 a 1) (/.f64 (*.f64 y b) t))) < -inf.0Initial program 64.0
Simplified38.7
Applied egg-rr38.7
Taylor expanded in z around inf 38.6
Simplified21.6
if -inf.0 < (/.f64 (+.f64 x (/.f64 (*.f64 y z) t)) (+.f64 (+.f64 a 1) (/.f64 (*.f64 y b) t))) < -9.9999875e-319 or 0.0 < (/.f64 (+.f64 x (/.f64 (*.f64 y z) t)) (+.f64 (+.f64 a 1) (/.f64 (*.f64 y b) t))) < 4.0000000000000002e299Initial program 0.4
if -9.9999875e-319 < (/.f64 (+.f64 x (/.f64 (*.f64 y z) t)) (+.f64 (+.f64 a 1) (/.f64 (*.f64 y b) t))) < 0.0Initial program 28.1
Simplified18.9
Applied egg-rr19.1
Taylor expanded in b around 0 18.3
Simplified11.7
Applied egg-rr10.6
if 4.0000000000000002e299 < (/.f64 (+.f64 x (/.f64 (*.f64 y z) t)) (+.f64 (+.f64 a 1) (/.f64 (*.f64 y b) t))) Initial program 63.3
Simplified52.4
Applied egg-rr52.5
Taylor expanded in b around 0 63.3
Simplified51.6
Taylor expanded in y around inf 6.0
Final simplification3.7
herbie shell --seed 2022165
(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.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))))