\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 3.532032554393501 \cdot 10^{-54}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\mathsf{expm1}\left(\varepsilon \cdot a\right)}\\
\end{array}double f(double a, double b, double eps) {
double r3538588 = eps;
double r3538589 = a;
double r3538590 = b;
double r3538591 = r3538589 + r3538590;
double r3538592 = r3538591 * r3538588;
double r3538593 = exp(r3538592);
double r3538594 = 1.0;
double r3538595 = r3538593 - r3538594;
double r3538596 = r3538588 * r3538595;
double r3538597 = r3538589 * r3538588;
double r3538598 = exp(r3538597);
double r3538599 = r3538598 - r3538594;
double r3538600 = r3538590 * r3538588;
double r3538601 = exp(r3538600);
double r3538602 = r3538601 - r3538594;
double r3538603 = r3538599 * r3538602;
double r3538604 = r3538596 / r3538603;
return r3538604;
}
double f(double a, double b, double eps) {
double r3538605 = eps;
double r3538606 = 3.532032554393501e-54;
bool r3538607 = r3538605 <= r3538606;
double r3538608 = 1.0;
double r3538609 = b;
double r3538610 = r3538608 / r3538609;
double r3538611 = a;
double r3538612 = r3538608 / r3538611;
double r3538613 = r3538610 + r3538612;
double r3538614 = r3538611 + r3538609;
double r3538615 = r3538614 * r3538605;
double r3538616 = expm1(r3538615);
double r3538617 = r3538609 * r3538605;
double r3538618 = expm1(r3538617);
double r3538619 = r3538616 / r3538618;
double r3538620 = r3538605 * r3538619;
double r3538621 = r3538605 * r3538611;
double r3538622 = expm1(r3538621);
double r3538623 = r3538620 / r3538622;
double r3538624 = r3538607 ? r3538613 : r3538623;
return r3538624;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 58.8 |
|---|---|
| Target | 13.6 |
| Herbie | 2.9 |
if eps < 3.532032554393501e-54Initial program 59.3
Simplified28.8
Taylor expanded around 0 2.7
if 3.532032554393501e-54 < eps Initial program 51.6
Simplified5.3
rmApplied div-inv6.2
Applied associate-*l*6.2
Simplified5.5
Final simplification2.9
herbie shell --seed 2019144 +o rules:numerics
(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))))