\frac{x + \frac{y \cdot z - x}{t \cdot z - x}}{x + 1}\begin{array}{l}
\mathbf{if}\;\frac{x + \frac{y \cdot z - x}{t \cdot z - x}}{x + 1} = -\infty:\\
\;\;\;\;\frac{1}{\frac{x + 1}{\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z, t, -x\right)}, z, x\right)}} - \frac{\mathsf{log1p}\left(\mathsf{expm1}\left(\frac{x}{t \cdot z - x}\right)\right)}{x + 1}\\
\mathbf{elif}\;\frac{x + \frac{y \cdot z - x}{t \cdot z - x}}{x + 1} \le 2.600138962860817447856891281313435992358 \cdot 10^{205}:\\
\;\;\;\;\frac{x + \frac{y \cdot z - x}{t \cdot z - x}}{x + 1}\\
\mathbf{else}:\\
\;\;\;\;\frac{x + \frac{y}{t}}{x + 1}\\
\end{array}double f(double x, double y, double z, double t) {
double r594061 = x;
double r594062 = y;
double r594063 = z;
double r594064 = r594062 * r594063;
double r594065 = r594064 - r594061;
double r594066 = t;
double r594067 = r594066 * r594063;
double r594068 = r594067 - r594061;
double r594069 = r594065 / r594068;
double r594070 = r594061 + r594069;
double r594071 = 1.0;
double r594072 = r594061 + r594071;
double r594073 = r594070 / r594072;
return r594073;
}
double f(double x, double y, double z, double t) {
double r594074 = x;
double r594075 = y;
double r594076 = z;
double r594077 = r594075 * r594076;
double r594078 = r594077 - r594074;
double r594079 = t;
double r594080 = r594079 * r594076;
double r594081 = r594080 - r594074;
double r594082 = r594078 / r594081;
double r594083 = r594074 + r594082;
double r594084 = 1.0;
double r594085 = r594074 + r594084;
double r594086 = r594083 / r594085;
double r594087 = -inf.0;
bool r594088 = r594086 <= r594087;
double r594089 = 1.0;
double r594090 = -r594074;
double r594091 = fma(r594076, r594079, r594090);
double r594092 = r594075 / r594091;
double r594093 = fma(r594092, r594076, r594074);
double r594094 = r594085 / r594093;
double r594095 = r594089 / r594094;
double r594096 = r594074 / r594081;
double r594097 = expm1(r594096);
double r594098 = log1p(r594097);
double r594099 = r594098 / r594085;
double r594100 = r594095 - r594099;
double r594101 = 2.6001389628608174e+205;
bool r594102 = r594086 <= r594101;
double r594103 = r594075 / r594079;
double r594104 = r594074 + r594103;
double r594105 = r594104 / r594085;
double r594106 = r594102 ? r594086 : r594105;
double r594107 = r594088 ? r594100 : r594106;
return r594107;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 7.3 |
|---|---|
| Target | 0.3 |
| Herbie | 2.0 |
if (/ (+ x (/ (- (* y z) x) (- (* t z) x))) (+ x 1.0)) < -inf.0Initial program 64.0
rmApplied div-sub64.0
Applied associate-+r-64.0
Applied div-sub64.0
Simplified4.7
rmApplied clear-num4.7
rmApplied log1p-expm1-u4.7
if -inf.0 < (/ (+ x (/ (- (* y z) x) (- (* t z) x))) (+ x 1.0)) < 2.6001389628608174e+205Initial program 0.7
if 2.6001389628608174e+205 < (/ (+ x (/ (- (* y z) x) (- (* t z) x))) (+ x 1.0)) Initial program 52.6
Taylor expanded around inf 13.7
Final simplification2.0
herbie shell --seed 2019351 +o rules:numerics
(FPCore (x y z t)
:name "Diagrams.Trail:splitAtParam from diagrams-lib-1.3.0.3, A"
:precision binary64
:herbie-target
(/ (+ x (- (/ y (- t (/ x z))) (/ x (- (* t z) x)))) (+ x 1))
(/ (+ x (/ (- (* y z) x) (- (* t z) x))) (+ x 1)))