\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.5467614379857191 \cdot 10^{-65}:\\
\;\;\;\;\sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}} \cdot \left(\sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}} \cdot \sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}}\right)\\
\mathbf{elif}\;\varepsilon \le 7.3489842320315626 \cdot 10^{-65}:\\
\;\;\;\;\frac{1}{b} + \frac{1}{a}\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}} \cdot \left(\sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}} \cdot \sqrt[3]{\frac{\frac{\mathsf{expm1}\left(\left(\left(a + b\right) \cdot \varepsilon\right)\right) \cdot \varepsilon}{\mathsf{expm1}\left(\left(a \cdot \varepsilon\right)\right)}}{\mathsf{expm1}\left(\left(b \cdot \varepsilon\right)\right)}}\right)\\
\end{array}double f(double a, double b, double eps) {
double r8461275 = eps;
double r8461276 = a;
double r8461277 = b;
double r8461278 = r8461276 + r8461277;
double r8461279 = r8461278 * r8461275;
double r8461280 = exp(r8461279);
double r8461281 = 1.0;
double r8461282 = r8461280 - r8461281;
double r8461283 = r8461275 * r8461282;
double r8461284 = r8461276 * r8461275;
double r8461285 = exp(r8461284);
double r8461286 = r8461285 - r8461281;
double r8461287 = r8461277 * r8461275;
double r8461288 = exp(r8461287);
double r8461289 = r8461288 - r8461281;
double r8461290 = r8461286 * r8461289;
double r8461291 = r8461283 / r8461290;
return r8461291;
}
double f(double a, double b, double eps) {
double r8461292 = eps;
double r8461293 = -1.5467614379857191e-65;
bool r8461294 = r8461292 <= r8461293;
double r8461295 = a;
double r8461296 = b;
double r8461297 = r8461295 + r8461296;
double r8461298 = r8461297 * r8461292;
double r8461299 = expm1(r8461298);
double r8461300 = r8461299 * r8461292;
double r8461301 = r8461295 * r8461292;
double r8461302 = expm1(r8461301);
double r8461303 = r8461300 / r8461302;
double r8461304 = r8461296 * r8461292;
double r8461305 = expm1(r8461304);
double r8461306 = r8461303 / r8461305;
double r8461307 = cbrt(r8461306);
double r8461308 = r8461307 * r8461307;
double r8461309 = r8461307 * r8461308;
double r8461310 = 7.3489842320315626e-65;
bool r8461311 = r8461292 <= r8461310;
double r8461312 = 1.0;
double r8461313 = r8461312 / r8461296;
double r8461314 = r8461312 / r8461295;
double r8461315 = r8461313 + r8461314;
double r8461316 = r8461311 ? r8461315 : r8461309;
double r8461317 = r8461294 ? r8461309 : r8461316;
return r8461317;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 58.7 |
|---|---|
| Target | 14.5 |
| Herbie | 2.9 |
if eps < -1.5467614379857191e-65 or 7.3489842320315626e-65 < eps Initial program 52.3
Simplified6.5
rmApplied add-cube-cbrt7.3
if -1.5467614379857191e-65 < eps < 7.3489842320315626e-65Initial program 60.1
Simplified40.6
Taylor expanded around 0 2.0
Final simplification2.9
herbie shell --seed 2019125 +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))))