\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 -173005857.2304000556468963623046875 \lor \neg \left(a \le 100503816208437458162455618952188928196600\right):\\
\;\;\;\;\frac{\varepsilon \cdot \left(\left({\left(e^{a + b}\right)}^{\varepsilon} - 1\right) + \left(\left(-1\right) + 1\right)\right)}{\sqrt[3]{{\left({\left(e^{a}\right)}^{\varepsilon} - 1\right)}^{3}} \cdot \mathsf{fma}\left(b, \varepsilon, {b}^{2} \cdot \left(\frac{1}{2} \cdot {\varepsilon}^{2} + \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\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)}\\
\end{array}double f(double a, double b, double eps) {
double r92183 = eps;
double r92184 = a;
double r92185 = b;
double r92186 = r92184 + r92185;
double r92187 = r92186 * r92183;
double r92188 = exp(r92187);
double r92189 = 1.0;
double r92190 = r92188 - r92189;
double r92191 = r92183 * r92190;
double r92192 = r92184 * r92183;
double r92193 = exp(r92192);
double r92194 = r92193 - r92189;
double r92195 = r92185 * r92183;
double r92196 = exp(r92195);
double r92197 = r92196 - r92189;
double r92198 = r92194 * r92197;
double r92199 = r92191 / r92198;
return r92199;
}
double f(double a, double b, double eps) {
double r92200 = a;
double r92201 = -173005857.23040006;
bool r92202 = r92200 <= r92201;
double r92203 = 1.0050381620843746e+41;
bool r92204 = r92200 <= r92203;
double r92205 = !r92204;
bool r92206 = r92202 || r92205;
double r92207 = eps;
double r92208 = b;
double r92209 = r92200 + r92208;
double r92210 = exp(r92209);
double r92211 = pow(r92210, r92207);
double r92212 = 1.0;
double r92213 = r92211 - r92212;
double r92214 = -r92212;
double r92215 = r92214 + r92212;
double r92216 = r92213 + r92215;
double r92217 = r92207 * r92216;
double r92218 = exp(r92200);
double r92219 = pow(r92218, r92207);
double r92220 = r92219 - r92212;
double r92221 = 3.0;
double r92222 = pow(r92220, r92221);
double r92223 = cbrt(r92222);
double r92224 = 2.0;
double r92225 = pow(r92208, r92224);
double r92226 = 0.5;
double r92227 = pow(r92207, r92224);
double r92228 = r92226 * r92227;
double r92229 = 0.16666666666666666;
double r92230 = pow(r92207, r92221);
double r92231 = r92229 * r92230;
double r92232 = r92231 * r92208;
double r92233 = r92228 + r92232;
double r92234 = r92225 * r92233;
double r92235 = fma(r92208, r92207, r92234);
double r92236 = r92223 * r92235;
double r92237 = r92217 / r92236;
double r92238 = r92209 * r92207;
double r92239 = exp(r92238);
double r92240 = r92239 - r92212;
double r92241 = r92207 * r92240;
double r92242 = pow(r92200, r92224);
double r92243 = r92226 * r92242;
double r92244 = pow(r92200, r92221);
double r92245 = r92229 * r92244;
double r92246 = r92245 * r92207;
double r92247 = r92243 + r92246;
double r92248 = r92227 * r92247;
double r92249 = fma(r92200, r92207, r92248);
double r92250 = r92208 * r92207;
double r92251 = exp(r92250);
double r92252 = r92251 - r92212;
double r92253 = r92249 * r92252;
double r92254 = r92241 / r92253;
double r92255 = r92206 ? r92237 : r92254;
return r92255;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.3 |
|---|---|
| Target | 15.0 |
| Herbie | 50.6 |
if a < -173005857.23040006 or 1.0050381620843746e+41 < a Initial program 55.1
Taylor expanded around 0 50.1
Simplified47.7
rmApplied add-cbrt-cube47.7
Simplified49.1
rmApplied add-cube-cbrt49.1
Applied add-sqr-sqrt49.1
Applied prod-diff49.1
Simplified42.1
Simplified42.1
if -173005857.23040006 < a < 1.0050381620843746e+41Initial program 63.9
Taylor expanded around 0 56.4
Simplified56.4
Final simplification50.6
herbie shell --seed 2019303 +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))))