double f(double a, double b, double eps) {
double r61904958 = eps;
double r61904959 = a;
double r61904960 = b;
double r61904961 = r61904959 + r61904960;
double r61904962 = r61904961 * r61904958;
double r61904963 = exp(r61904962);
double r61904964 = 1.0;
double r61904965 = r61904963 - r61904964;
double r61904966 = r61904958 * r61904965;
double r61904967 = r61904959 * r61904958;
double r61904968 = exp(r61904967);
double r61904969 = r61904968 - r61904964;
double r61904970 = r61904960 * r61904958;
double r61904971 = exp(r61904970);
double r61904972 = r61904971 - r61904964;
double r61904973 = r61904969 * r61904972;
double r61904974 = r61904966 / r61904973;
return r61904974;
}
double f(double a, double b, double eps) {
double r61904975 = a;
double r61904976 = -5.130891534960253e+81;
bool r61904977 = r61904975 <= r61904976;
double r61904978 = eps;
double r61904979 = b;
double r61904980 = r61904975 + r61904979;
double r61904981 = r61904978 * r61904980;
double r61904982 = exp(r61904981);
double r61904983 = 1.0;
double r61904984 = r61904982 - r61904983;
double r61904985 = r61904978 * r61904984;
double r61904986 = r61904978 * r61904979;
double r61904987 = 0.5;
double r61904988 = r61904986 * r61904986;
double r61904989 = r61904987 * r61904988;
double r61904990 = r61904988 * r61904979;
double r61904991 = r61904978 * r61904990;
double r61904992 = 0.16666666666666666;
double r61904993 = r61904991 * r61904992;
double r61904994 = r61904989 + r61904993;
double r61904995 = r61904986 + r61904994;
double r61904996 = r61904978 * r61904975;
double r61904997 = exp(r61904996);
double r61904998 = r61904997 - r61904983;
double r61904999 = r61904995 * r61904998;
double r61905000 = r61904985 / r61904999;
double r61905001 = 2.412797467091225e+146;
bool r61905002 = r61904975 <= r61905001;
double r61905003 = 3.0;
double r61905004 = pow(r61904982, r61905003);
double r61905005 = r61905004 - r61904983;
double r61905006 = r61904982 + r61904983;
double r61905007 = r61904982 * r61904982;
double r61905008 = r61905006 + r61905007;
double r61905009 = r61905005 / r61905008;
double r61905010 = r61904978 * r61905009;
double r61905011 = exp(r61904986);
double r61905012 = r61905011 - r61904983;
double r61905013 = r61904996 * r61904996;
double r61905014 = r61904987 * r61905013;
double r61905015 = r61904975 * r61904992;
double r61905016 = r61905015 * r61905013;
double r61905017 = r61905016 * r61904978;
double r61905018 = r61905017 + r61904996;
double r61905019 = r61905014 + r61905018;
double r61905020 = r61905012 * r61905019;
double r61905021 = r61905010 / r61905020;
double r61905022 = r61905002 ? r61905021 : r61905000;
double r61905023 = r61904977 ? r61905000 : r61905022;
return r61905023;
}
\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\begin{array}{l}
\mathbf{if}\;a \le -5.130891534960253 \cdot 10^{+81}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\varepsilon \cdot \left(a + b\right)} - 1\right)}{\left(\varepsilon \cdot b + \left(\frac{1}{2} \cdot \left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) + \left(\varepsilon \cdot \left(\left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) \cdot b\right)\right) \cdot \frac{1}{6}\right)\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)}\\
\mathbf{elif}\;a \le 2.412797467091225 \cdot 10^{+146}:\\
\;\;\;\;\frac{\varepsilon \cdot \frac{{\left(e^{\varepsilon \cdot \left(a + b\right)}\right)}^{3} - 1}{\left(e^{\varepsilon \cdot \left(a + b\right)} + 1\right) + e^{\varepsilon \cdot \left(a + b\right)} \cdot e^{\varepsilon \cdot \left(a + b\right)}}}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(\frac{1}{2} \cdot \left(\left(\varepsilon \cdot a\right) \cdot \left(\varepsilon \cdot a\right)\right) + \left(\left(\left(a \cdot \frac{1}{6}\right) \cdot \left(\left(\varepsilon \cdot a\right) \cdot \left(\varepsilon \cdot a\right)\right)\right) \cdot \varepsilon + \varepsilon \cdot a\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\varepsilon \cdot \left(a + b\right)} - 1\right)}{\left(\varepsilon \cdot b + \left(\frac{1}{2} \cdot \left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) + \left(\varepsilon \cdot \left(\left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) \cdot b\right)\right) \cdot \frac{1}{6}\right)\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)}\\
\end{array}



Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 58.6 |
|---|---|
| Target | 14.2 |
| Herbie | 51.3 |
if a < -5.130891534960253e+81 or 2.412797467091225e+146 < a Initial program 51.2
Taylor expanded around 0 44.8
Simplified40.8
if -5.130891534960253e+81 < a < 2.412797467091225e+146Initial program 61.1
Taylor expanded around 0 54.9
Simplified54.7
rmApplied flip3--54.9
Final simplification51.3
herbie shell --seed 2019101
(FPCore (a b eps)
:name "expq3 (problem 3.4.2)"
:pre (and (< -1 eps) (< eps 1))
:herbie-target
(/ (+ a b) (* a b))
(/ (* eps (- (exp (* (+ a b) eps)) 1)) (* (- (exp (* a eps)) 1) (- (exp (* b eps)) 1))))