\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}{\frac{e^{\mathsf{fma}\left(a, \varepsilon, \varepsilon \cdot b\right)} + \left(1 - \mathsf{fma}\left(1, e^{\varepsilon \cdot b}, 1 \cdot e^{a \cdot \varepsilon}\right)\right)}{e^{\left(a + b\right) \cdot \varepsilon} - 1}}\\
\end{array}double f(double a, double b, double eps) {
double r84970 = eps;
double r84971 = a;
double r84972 = b;
double r84973 = r84971 + r84972;
double r84974 = r84973 * r84970;
double r84975 = exp(r84974);
double r84976 = 1.0;
double r84977 = r84975 - r84976;
double r84978 = r84970 * r84977;
double r84979 = r84971 * r84970;
double r84980 = exp(r84979);
double r84981 = r84980 - r84976;
double r84982 = r84972 * r84970;
double r84983 = exp(r84982);
double r84984 = r84983 - r84976;
double r84985 = r84981 * r84984;
double r84986 = r84978 / r84985;
return r84986;
}
double f(double a, double b, double eps) {
double r84987 = eps;
double r84988 = 5.3360736243582115e-31;
bool r84989 = r84987 <= r84988;
double r84990 = 1.0;
double r84991 = b;
double r84992 = r84990 / r84991;
double r84993 = a;
double r84994 = r84990 / r84993;
double r84995 = r84992 + r84994;
double r84996 = r84987 * r84991;
double r84997 = fma(r84993, r84987, r84996);
double r84998 = exp(r84997);
double r84999 = 1.0;
double r85000 = exp(r84996);
double r85001 = r84993 * r84987;
double r85002 = exp(r85001);
double r85003 = r84999 * r85002;
double r85004 = fma(r84999, r85000, r85003);
double r85005 = r84999 - r85004;
double r85006 = r84998 + r85005;
double r85007 = r84993 + r84991;
double r85008 = r85007 * r84987;
double r85009 = exp(r85008);
double r85010 = r85009 - r84999;
double r85011 = r85006 / r85010;
double r85012 = r84987 / r85011;
double r85013 = r84989 ? r84995 : r85012;
return r85013;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| 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
Taylor expanded around inf 55.1
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))))