\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}\;b \le -8.567098253796798289657281504730612089987 \cdot 10^{120} \lor \neg \left(b \le 0.2147503712635026318356068486536969430745\right):\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(\frac{1}{6} \cdot {\left(a \cdot \varepsilon\right)}^{3} + \left(\frac{1}{2} \cdot \left({a}^{2} \cdot {\varepsilon}^{2}\right) + a \cdot \varepsilon\right)\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(\frac{1}{6} \cdot \left({\varepsilon}^{3} \cdot {b}^{3}\right) + \left(\frac{1}{2} \cdot \left({\varepsilon}^{2} \cdot {b}^{2}\right) + \varepsilon \cdot b\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r97403 = eps;
double r97404 = a;
double r97405 = b;
double r97406 = r97404 + r97405;
double r97407 = r97406 * r97403;
double r97408 = exp(r97407);
double r97409 = 1.0;
double r97410 = r97408 - r97409;
double r97411 = r97403 * r97410;
double r97412 = r97404 * r97403;
double r97413 = exp(r97412);
double r97414 = r97413 - r97409;
double r97415 = r97405 * r97403;
double r97416 = exp(r97415);
double r97417 = r97416 - r97409;
double r97418 = r97414 * r97417;
double r97419 = r97411 / r97418;
return r97419;
}
double f(double a, double b, double eps) {
double r97420 = b;
double r97421 = -8.567098253796798e+120;
bool r97422 = r97420 <= r97421;
double r97423 = 0.21475037126350263;
bool r97424 = r97420 <= r97423;
double r97425 = !r97424;
bool r97426 = r97422 || r97425;
double r97427 = eps;
double r97428 = a;
double r97429 = r97428 + r97420;
double r97430 = r97429 * r97427;
double r97431 = exp(r97430);
double r97432 = 1.0;
double r97433 = r97431 - r97432;
double r97434 = r97427 * r97433;
double r97435 = 0.16666666666666666;
double r97436 = r97428 * r97427;
double r97437 = 3.0;
double r97438 = pow(r97436, r97437);
double r97439 = r97435 * r97438;
double r97440 = 0.5;
double r97441 = 2.0;
double r97442 = pow(r97428, r97441);
double r97443 = pow(r97427, r97441);
double r97444 = r97442 * r97443;
double r97445 = r97440 * r97444;
double r97446 = r97445 + r97436;
double r97447 = r97439 + r97446;
double r97448 = r97420 * r97427;
double r97449 = exp(r97448);
double r97450 = r97449 - r97432;
double r97451 = r97447 * r97450;
double r97452 = r97434 / r97451;
double r97453 = exp(r97436);
double r97454 = r97453 - r97432;
double r97455 = pow(r97427, r97437);
double r97456 = pow(r97420, r97437);
double r97457 = r97455 * r97456;
double r97458 = r97435 * r97457;
double r97459 = pow(r97420, r97441);
double r97460 = r97443 * r97459;
double r97461 = r97440 * r97460;
double r97462 = r97427 * r97420;
double r97463 = r97461 + r97462;
double r97464 = r97458 + r97463;
double r97465 = r97454 * r97464;
double r97466 = r97434 / r97465;
double r97467 = r97426 ? r97452 : r97466;
return r97467;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.2 |
|---|---|
| Target | 14.8 |
| Herbie | 52.8 |
if b < -8.567098253796798e+120Initial program 52.2
Taylor expanded around 0 43.9
rmApplied add-cbrt-cube43.9
Simplified43.9
if -8.567098253796798e+120 < b < 0.21475037126350263Initial program 63.4
Taylor expanded around 0 55.8
if 0.21475037126350263 < b Initial program 55.2
Taylor expanded around 0 51.0
rmApplied pow-prod-down49.6
Final simplification52.8
herbie shell --seed 2019297
(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))))