\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 -7.755384029378696343575688420881066759931 \cdot 10^{176}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \mathsf{fma}\left(b, \varepsilon, b \cdot \left(b \cdot \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)\right)\right)}\\
\mathbf{elif}\;a \le -5.831284548290567253917133279792100635835 \cdot 10^{81}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\mathsf{fma}\left(\sqrt{e^{a \cdot \varepsilon}}, \sqrt{e^{a \cdot \varepsilon}}, -1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\mathbf{elif}\;a \le 11675070506728611840:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\mathsf{fma}\left(a, \varepsilon, {\varepsilon}^{2} \cdot \left(\frac{1}{2} \cdot {a}^{2} + \left(\frac{1}{6} \cdot {a}^{3}\right) \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(b, \varepsilon, b \cdot \left(b \cdot \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r76320 = eps;
double r76321 = a;
double r76322 = b;
double r76323 = r76321 + r76322;
double r76324 = r76323 * r76320;
double r76325 = exp(r76324);
double r76326 = 1.0;
double r76327 = r76325 - r76326;
double r76328 = r76320 * r76327;
double r76329 = r76321 * r76320;
double r76330 = exp(r76329);
double r76331 = r76330 - r76326;
double r76332 = r76322 * r76320;
double r76333 = exp(r76332);
double r76334 = r76333 - r76326;
double r76335 = r76331 * r76334;
double r76336 = r76328 / r76335;
return r76336;
}
double f(double a, double b, double eps) {
double r76337 = a;
double r76338 = -7.755384029378696e+176;
bool r76339 = r76337 <= r76338;
double r76340 = eps;
double r76341 = b;
double r76342 = r76337 + r76341;
double r76343 = r76342 * r76340;
double r76344 = exp(r76343);
double r76345 = 1.0;
double r76346 = r76344 - r76345;
double r76347 = r76340 * r76346;
double r76348 = r76337 * r76340;
double r76349 = exp(r76348);
double r76350 = r76349 - r76345;
double r76351 = 0.5;
double r76352 = 2.0;
double r76353 = pow(r76340, r76352);
double r76354 = 0.16666666666666666;
double r76355 = 3.0;
double r76356 = pow(r76340, r76355);
double r76357 = r76354 * r76356;
double r76358 = r76357 * r76341;
double r76359 = fma(r76351, r76353, r76358);
double r76360 = r76341 * r76359;
double r76361 = r76341 * r76360;
double r76362 = fma(r76341, r76340, r76361);
double r76363 = r76350 * r76362;
double r76364 = r76347 / r76363;
double r76365 = -5.831284548290567e+81;
bool r76366 = r76337 <= r76365;
double r76367 = sqrt(r76349);
double r76368 = -r76345;
double r76369 = fma(r76367, r76367, r76368);
double r76370 = r76341 * r76340;
double r76371 = exp(r76370);
double r76372 = r76371 - r76345;
double r76373 = r76369 * r76372;
double r76374 = r76347 / r76373;
double r76375 = 1.1675070506728612e+19;
bool r76376 = r76337 <= r76375;
double r76377 = pow(r76337, r76352);
double r76378 = r76351 * r76377;
double r76379 = pow(r76337, r76355);
double r76380 = r76354 * r76379;
double r76381 = r76380 * r76340;
double r76382 = r76378 + r76381;
double r76383 = r76353 * r76382;
double r76384 = fma(r76337, r76340, r76383);
double r76385 = r76384 * r76372;
double r76386 = r76347 / r76385;
double r76387 = r76376 ? r76386 : r76364;
double r76388 = r76366 ? r76374 : r76387;
double r76389 = r76339 ? r76364 : r76388;
return r76389;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.3 |
|---|---|
| Target | 14.3 |
| Herbie | 52.3 |
if a < -7.755384029378696e+176 or 1.1675070506728612e+19 < a Initial program 54.2
Taylor expanded around 0 47.4
Simplified44.4
rmApplied sqr-pow44.4
Applied associate-*l*43.1
Simplified43.1
if -7.755384029378696e+176 < a < -5.831284548290567e+81Initial program 55.9
rmApplied add-sqr-sqrt55.9
Applied fma-neg55.9
if -5.831284548290567e+81 < a < 1.1675070506728612e+19Initial program 63.7
Taylor expanded around 0 56.1
Simplified56.1
Final simplification52.3
herbie shell --seed 2019347 +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))))