\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}\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)} = -\infty:\\
\;\;\;\;\frac{1}{a} + \frac{1}{b}\\
\mathbf{elif}\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)} \le 3.502190010791832831227506580315349260513 \cdot 10^{-9}:\\
\;\;\;\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{a} + \frac{1}{b}\\
\end{array}double f(double a, double b, double eps) {
double r5696747 = eps;
double r5696748 = a;
double r5696749 = b;
double r5696750 = r5696748 + r5696749;
double r5696751 = r5696750 * r5696747;
double r5696752 = exp(r5696751);
double r5696753 = 1.0;
double r5696754 = r5696752 - r5696753;
double r5696755 = r5696747 * r5696754;
double r5696756 = r5696748 * r5696747;
double r5696757 = exp(r5696756);
double r5696758 = r5696757 - r5696753;
double r5696759 = r5696749 * r5696747;
double r5696760 = exp(r5696759);
double r5696761 = r5696760 - r5696753;
double r5696762 = r5696758 * r5696761;
double r5696763 = r5696755 / r5696762;
return r5696763;
}
double f(double a, double b, double eps) {
double r5696764 = a;
double r5696765 = b;
double r5696766 = r5696764 + r5696765;
double r5696767 = eps;
double r5696768 = r5696766 * r5696767;
double r5696769 = exp(r5696768);
double r5696770 = 1.0;
double r5696771 = r5696769 - r5696770;
double r5696772 = r5696771 * r5696767;
double r5696773 = r5696767 * r5696765;
double r5696774 = exp(r5696773);
double r5696775 = r5696774 - r5696770;
double r5696776 = r5696767 * r5696764;
double r5696777 = exp(r5696776);
double r5696778 = r5696777 - r5696770;
double r5696779 = r5696775 * r5696778;
double r5696780 = r5696772 / r5696779;
double r5696781 = -inf.0;
bool r5696782 = r5696780 <= r5696781;
double r5696783 = 1.0;
double r5696784 = r5696783 / r5696764;
double r5696785 = r5696783 / r5696765;
double r5696786 = r5696784 + r5696785;
double r5696787 = 3.502190010791833e-09;
bool r5696788 = r5696780 <= r5696787;
double r5696789 = r5696788 ? r5696780 : r5696786;
double r5696790 = r5696782 ? r5696786 : r5696789;
return r5696790;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.3 |
|---|---|
| Target | 14.8 |
| Herbie | 0.3 |
if (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < -inf.0 or 3.502190010791833e-09 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) Initial program 63.9
Taylor expanded around 0 0.1
if -inf.0 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < 3.502190010791833e-09Initial program 3.6
Final simplification0.3
herbie shell --seed 2019170
(FPCore (a b eps)
:name "expq3 (problem 3.4.2)"
:pre (and (< -1.0 eps) (< eps 1.0))
:herbie-target
(/ (+ a b) (* a b))
(/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))))