\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 1.4538299418999213 \cdot 10^{-51}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)} \cdot \mathsf{expm1}\left(\varepsilon \cdot \left(a + b\right)\right)}}\\
\end{array}double f(double a, double b, double eps) {
double r4479047 = eps;
double r4479048 = a;
double r4479049 = b;
double r4479050 = r4479048 + r4479049;
double r4479051 = r4479050 * r4479047;
double r4479052 = exp(r4479051);
double r4479053 = 1.0;
double r4479054 = r4479052 - r4479053;
double r4479055 = r4479047 * r4479054;
double r4479056 = r4479048 * r4479047;
double r4479057 = exp(r4479056);
double r4479058 = r4479057 - r4479053;
double r4479059 = r4479049 * r4479047;
double r4479060 = exp(r4479059);
double r4479061 = r4479060 - r4479053;
double r4479062 = r4479058 * r4479061;
double r4479063 = r4479055 / r4479062;
return r4479063;
}
double f(double a, double b, double eps) {
double r4479064 = eps;
double r4479065 = 1.4538299418999213e-51;
bool r4479066 = r4479064 <= r4479065;
double r4479067 = 1.0;
double r4479068 = b;
double r4479069 = r4479067 / r4479068;
double r4479070 = a;
double r4479071 = r4479067 / r4479070;
double r4479072 = r4479069 + r4479071;
double r4479073 = r4479064 * r4479070;
double r4479074 = expm1(r4479073);
double r4479075 = r4479068 * r4479064;
double r4479076 = expm1(r4479075);
double r4479077 = r4479064 / r4479076;
double r4479078 = r4479070 + r4479068;
double r4479079 = r4479064 * r4479078;
double r4479080 = expm1(r4479079);
double r4479081 = r4479077 * r4479080;
double r4479082 = r4479074 / r4479081;
double r4479083 = r4479067 / r4479082;
double r4479084 = r4479066 ? r4479072 : r4479083;
return r4479084;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 58.7 |
|---|---|
| Target | 14.7 |
| Herbie | 2.8 |
if eps < 1.4538299418999213e-51Initial program 59.2
Simplified29.3
Taylor expanded around 0 2.8
if 1.4538299418999213e-51 < eps Initial program 51.3
Simplified3.0
rmApplied clear-num3.0
Final simplification2.8
herbie shell --seed 2019149 +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))))