\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}\;a \le -346828314544410.562:\\
\;\;\;\;\frac{\varepsilon \cdot \frac{\mathsf{fma}\left(-1, 1, {\left(e^{a + b}\right)}^{\left(2 \cdot \varepsilon\right)}\right)}{e^{\left(a + b\right) \cdot \varepsilon} + 1}}{\frac{\mathsf{fma}\left(-1, 1, {\left(e^{a}\right)}^{\left(2 \cdot \varepsilon\right)}\right)}{e^{a \cdot \varepsilon} + 1} \cdot \mathsf{fma}\left(\frac{1}{6}, {\varepsilon}^{3} \cdot {b}^{3}, \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2} \cdot {b}^{2}, \varepsilon \cdot b\right)\right)}\\
\mathbf{elif}\;a \le 3.5459178958752838 \cdot 10^{64}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\mathsf{fma}\left(\frac{1}{6}, {a}^{3} \cdot {\varepsilon}^{3}, \mathsf{fma}\left(\frac{1}{2}, {a}^{2} \cdot {\varepsilon}^{2}, 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 \mathsf{fma}\left(\frac{1}{6}, \left(\left({\varepsilon}^{3} \cdot b\right) \cdot b\right) \cdot b, \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2} \cdot {b}^{2}, \varepsilon \cdot b\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r79507 = eps;
double r79508 = a;
double r79509 = b;
double r79510 = r79508 + r79509;
double r79511 = r79510 * r79507;
double r79512 = exp(r79511);
double r79513 = 1.0;
double r79514 = r79512 - r79513;
double r79515 = r79507 * r79514;
double r79516 = r79508 * r79507;
double r79517 = exp(r79516);
double r79518 = r79517 - r79513;
double r79519 = r79509 * r79507;
double r79520 = exp(r79519);
double r79521 = r79520 - r79513;
double r79522 = r79518 * r79521;
double r79523 = r79515 / r79522;
return r79523;
}
double f(double a, double b, double eps) {
double r79524 = a;
double r79525 = -346828314544410.56;
bool r79526 = r79524 <= r79525;
double r79527 = eps;
double r79528 = 1.0;
double r79529 = -r79528;
double r79530 = b;
double r79531 = r79524 + r79530;
double r79532 = exp(r79531);
double r79533 = 2.0;
double r79534 = r79533 * r79527;
double r79535 = pow(r79532, r79534);
double r79536 = fma(r79529, r79528, r79535);
double r79537 = r79531 * r79527;
double r79538 = exp(r79537);
double r79539 = r79538 + r79528;
double r79540 = r79536 / r79539;
double r79541 = r79527 * r79540;
double r79542 = exp(r79524);
double r79543 = pow(r79542, r79534);
double r79544 = fma(r79529, r79528, r79543);
double r79545 = r79524 * r79527;
double r79546 = exp(r79545);
double r79547 = r79546 + r79528;
double r79548 = r79544 / r79547;
double r79549 = 0.16666666666666666;
double r79550 = 3.0;
double r79551 = pow(r79527, r79550);
double r79552 = pow(r79530, r79550);
double r79553 = r79551 * r79552;
double r79554 = 0.5;
double r79555 = pow(r79527, r79533);
double r79556 = pow(r79530, r79533);
double r79557 = r79555 * r79556;
double r79558 = r79527 * r79530;
double r79559 = fma(r79554, r79557, r79558);
double r79560 = fma(r79549, r79553, r79559);
double r79561 = r79548 * r79560;
double r79562 = r79541 / r79561;
double r79563 = 3.545917895875284e+64;
bool r79564 = r79524 <= r79563;
double r79565 = r79538 - r79528;
double r79566 = r79527 * r79565;
double r79567 = pow(r79524, r79550);
double r79568 = r79567 * r79551;
double r79569 = pow(r79524, r79533);
double r79570 = r79569 * r79555;
double r79571 = fma(r79554, r79570, r79545);
double r79572 = fma(r79549, r79568, r79571);
double r79573 = r79530 * r79527;
double r79574 = exp(r79573);
double r79575 = r79574 - r79528;
double r79576 = r79572 * r79575;
double r79577 = r79566 / r79576;
double r79578 = r79546 - r79528;
double r79579 = r79551 * r79530;
double r79580 = r79579 * r79530;
double r79581 = r79580 * r79530;
double r79582 = fma(r79549, r79581, r79559);
double r79583 = r79578 * r79582;
double r79584 = r79566 / r79583;
double r79585 = r79564 ? r79577 : r79584;
double r79586 = r79526 ? r79562 : r79585;
return r79586;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.6 |
|---|---|
| Target | 14.7 |
| Herbie | 52.4 |
if a < -346828314544410.56Initial program 55.7
Taylor expanded around 0 49.6
Simplified49.6
rmApplied flip--50.2
Simplified51.4
rmApplied flip--51.4
Simplified45.4
if -346828314544410.56 < a < 3.545917895875284e+64Initial program 63.7
Taylor expanded around 0 56.4
Simplified56.4
if 3.545917895875284e+64 < a Initial program 55.0
Taylor expanded around 0 47.3
Simplified47.3
rmApplied unpow347.3
Applied associate-*r*46.4
Simplified45.7
Final simplification52.4
herbie shell --seed 2020018 +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))))