\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}\;\varepsilon \le 5.3360736243582115 \cdot 10^{-31}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\log \left(e^{e^{a \cdot \varepsilon} - 1}\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\end{array}double f(double a, double b, double eps) {
double r136671 = eps;
double r136672 = a;
double r136673 = b;
double r136674 = r136672 + r136673;
double r136675 = r136674 * r136671;
double r136676 = exp(r136675);
double r136677 = 1.0;
double r136678 = r136676 - r136677;
double r136679 = r136671 * r136678;
double r136680 = r136672 * r136671;
double r136681 = exp(r136680);
double r136682 = r136681 - r136677;
double r136683 = r136673 * r136671;
double r136684 = exp(r136683);
double r136685 = r136684 - r136677;
double r136686 = r136682 * r136685;
double r136687 = r136679 / r136686;
return r136687;
}
double f(double a, double b, double eps) {
double r136688 = eps;
double r136689 = 5.3360736243582115e-31;
bool r136690 = r136688 <= r136689;
double r136691 = 1.0;
double r136692 = b;
double r136693 = r136691 / r136692;
double r136694 = a;
double r136695 = r136691 / r136694;
double r136696 = r136693 + r136695;
double r136697 = r136694 + r136692;
double r136698 = r136697 * r136688;
double r136699 = exp(r136698);
double r136700 = 1.0;
double r136701 = r136699 - r136700;
double r136702 = r136688 * r136701;
double r136703 = r136694 * r136688;
double r136704 = exp(r136703);
double r136705 = r136704 - r136700;
double r136706 = exp(r136705);
double r136707 = log(r136706);
double r136708 = r136692 * r136688;
double r136709 = exp(r136708);
double r136710 = r136709 - r136700;
double r136711 = r136707 * r136710;
double r136712 = r136702 / r136711;
double r136713 = r136690 ? r136696 : r136712;
return r136713;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.4 |
|---|---|
| Target | 14.6 |
| Herbie | 4.8 |
if eps < 5.3360736243582115e-31Initial program 60.8
Taylor expanded around 0 2.9
if 5.3360736243582115e-31 < eps Initial program 50.7
rmApplied add-log-exp50.7
Applied add-log-exp50.7
Applied diff-log50.7
Simplified50.7
Final simplification4.8
herbie shell --seed 2020046 +o rules:numerics
(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))))