\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{\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)} = -\infty \lor \neg \left(\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)} \le 4.275877483011707453930622974464582369913 \cdot 10^{-79}\right):\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\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)}\\
\end{array}double f(double a, double b, double eps) {
double r80233 = eps;
double r80234 = a;
double r80235 = b;
double r80236 = r80234 + r80235;
double r80237 = r80236 * r80233;
double r80238 = exp(r80237);
double r80239 = 1.0;
double r80240 = r80238 - r80239;
double r80241 = r80233 * r80240;
double r80242 = r80234 * r80233;
double r80243 = exp(r80242);
double r80244 = r80243 - r80239;
double r80245 = r80235 * r80233;
double r80246 = exp(r80245);
double r80247 = r80246 - r80239;
double r80248 = r80244 * r80247;
double r80249 = r80241 / r80248;
return r80249;
}
double f(double a, double b, double eps) {
double r80250 = eps;
double r80251 = a;
double r80252 = b;
double r80253 = r80251 + r80252;
double r80254 = r80253 * r80250;
double r80255 = exp(r80254);
double r80256 = 1.0;
double r80257 = r80255 - r80256;
double r80258 = r80250 * r80257;
double r80259 = r80251 * r80250;
double r80260 = exp(r80259);
double r80261 = r80260 - r80256;
double r80262 = r80252 * r80250;
double r80263 = exp(r80262);
double r80264 = r80263 - r80256;
double r80265 = r80261 * r80264;
double r80266 = r80258 / r80265;
double r80267 = -inf.0;
bool r80268 = r80266 <= r80267;
double r80269 = 4.2758774830117075e-79;
bool r80270 = r80266 <= r80269;
double r80271 = !r80270;
bool r80272 = r80268 || r80271;
double r80273 = 1.0;
double r80274 = r80273 / r80252;
double r80275 = r80273 / r80251;
double r80276 = r80274 + r80275;
double r80277 = r80272 ? r80276 : r80266;
return r80277;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.4 |
|---|---|
| Target | 14.8 |
| Herbie | 0.7 |
if (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < -inf.0 or 4.2758774830117075e-79 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) Initial program 63.4
Taylor expanded around 0 0.6
if -inf.0 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < 4.2758774830117075e-79Initial program 3.4
Final simplification0.7
herbie shell --seed 2019304 +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))))