\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 -3.769180615523052145041500628953914450441 \cdot 10^{199}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(\sqrt{e^{a \cdot \varepsilon}} + \sqrt{1}\right) \cdot \left(\left(\sqrt{e^{a \cdot \varepsilon}} - \sqrt{1}\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)\right)}\\
\mathbf{elif}\;a \le -1.038597880779305183664878388970788512797 \cdot 10^{87}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(\frac{1}{6} \cdot \left({\varepsilon}^{3} \cdot {b}^{3}\right) + \left(\frac{1}{2} \cdot \left({\varepsilon}^{2} \cdot {b}^{2}\right) + \varepsilon \cdot b\right)\right)}\\
\mathbf{elif}\;a \le 220317097075129401207632210071965296230400:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(\frac{1}{6} \cdot \left(\left(a \cdot a\right) \cdot \left(a \cdot {\varepsilon}^{3}\right)\right) + \left(\frac{1}{2} \cdot \log \left(e^{{a}^{2} \cdot {\varepsilon}^{2}}\right) + a \cdot \varepsilon\right)\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(\frac{1}{6} \cdot \left({\varepsilon}^{3} \cdot {b}^{3}\right) + \left(\frac{1}{2} \cdot \left({\varepsilon}^{2} \cdot {b}^{2}\right) + \varepsilon \cdot b\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r77987 = eps;
double r77988 = a;
double r77989 = b;
double r77990 = r77988 + r77989;
double r77991 = r77990 * r77987;
double r77992 = exp(r77991);
double r77993 = 1.0;
double r77994 = r77992 - r77993;
double r77995 = r77987 * r77994;
double r77996 = r77988 * r77987;
double r77997 = exp(r77996);
double r77998 = r77997 - r77993;
double r77999 = r77989 * r77987;
double r78000 = exp(r77999);
double r78001 = r78000 - r77993;
double r78002 = r77998 * r78001;
double r78003 = r77995 / r78002;
return r78003;
}
double f(double a, double b, double eps) {
double r78004 = a;
double r78005 = -3.769180615523052e+199;
bool r78006 = r78004 <= r78005;
double r78007 = eps;
double r78008 = b;
double r78009 = r78004 + r78008;
double r78010 = r78009 * r78007;
double r78011 = exp(r78010);
double r78012 = 1.0;
double r78013 = r78011 - r78012;
double r78014 = r78007 * r78013;
double r78015 = r78004 * r78007;
double r78016 = exp(r78015);
double r78017 = sqrt(r78016);
double r78018 = sqrt(r78012);
double r78019 = r78017 + r78018;
double r78020 = r78017 - r78018;
double r78021 = r78008 * r78007;
double r78022 = exp(r78021);
double r78023 = r78022 - r78012;
double r78024 = r78020 * r78023;
double r78025 = r78019 * r78024;
double r78026 = r78014 / r78025;
double r78027 = -1.0385978807793052e+87;
bool r78028 = r78004 <= r78027;
double r78029 = r78016 - r78012;
double r78030 = 0.16666666666666666;
double r78031 = 3.0;
double r78032 = pow(r78007, r78031);
double r78033 = pow(r78008, r78031);
double r78034 = r78032 * r78033;
double r78035 = r78030 * r78034;
double r78036 = 0.5;
double r78037 = 2.0;
double r78038 = pow(r78007, r78037);
double r78039 = pow(r78008, r78037);
double r78040 = r78038 * r78039;
double r78041 = r78036 * r78040;
double r78042 = r78007 * r78008;
double r78043 = r78041 + r78042;
double r78044 = r78035 + r78043;
double r78045 = r78029 * r78044;
double r78046 = r78014 / r78045;
double r78047 = 2.203170970751294e+41;
bool r78048 = r78004 <= r78047;
double r78049 = r78004 * r78004;
double r78050 = r78004 * r78032;
double r78051 = r78049 * r78050;
double r78052 = r78030 * r78051;
double r78053 = pow(r78004, r78037);
double r78054 = r78053 * r78038;
double r78055 = exp(r78054);
double r78056 = log(r78055);
double r78057 = r78036 * r78056;
double r78058 = r78057 + r78015;
double r78059 = r78052 + r78058;
double r78060 = r78059 * r78023;
double r78061 = r78014 / r78060;
double r78062 = r78048 ? r78061 : r78046;
double r78063 = r78028 ? r78046 : r78062;
double r78064 = r78006 ? r78026 : r78063;
return r78064;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.4 |
|---|---|
| Target | 15.1 |
| Herbie | 53.8 |
if a < -3.769180615523052e+199Initial program 51.5
rmApplied add-sqr-sqrt51.5
Applied add-sqr-sqrt51.5
Applied difference-of-squares51.5
Applied associate-*l*51.5
if -3.769180615523052e+199 < a < -1.0385978807793052e+87 or 2.203170970751294e+41 < a Initial program 55.1
Taylor expanded around 0 49.5
if -1.0385978807793052e+87 < a < 2.203170970751294e+41Initial program 63.5
Taylor expanded around 0 56.0
rmApplied unpow356.0
Applied associate-*l*56.0
rmApplied add-log-exp55.9
Final simplification53.8
herbie shell --seed 2019291
(FPCore (a b eps)
:name "expq3 (problem 3.4.2)"
:precision binary64
: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))))