double f(double a, double b, double eps) {
double r7522172 = eps;
double r7522173 = a;
double r7522174 = b;
double r7522175 = r7522173 + r7522174;
double r7522176 = r7522175 * r7522172;
double r7522177 = exp(r7522176);
double r7522178 = 1.0;
double r7522179 = r7522177 - r7522178;
double r7522180 = r7522172 * r7522179;
double r7522181 = r7522173 * r7522172;
double r7522182 = exp(r7522181);
double r7522183 = r7522182 - r7522178;
double r7522184 = r7522174 * r7522172;
double r7522185 = exp(r7522184);
double r7522186 = r7522185 - r7522178;
double r7522187 = r7522183 * r7522186;
double r7522188 = r7522180 / r7522187;
return r7522188;
}
double f(double a, double b, double __attribute__((unused)) eps) {
double r7522189 = 1.0;
double r7522190 = a;
double r7522191 = r7522189 / r7522190;
double r7522192 = b;
double r7522193 = r7522189 / r7522192;
double r7522194 = r7522191 + r7522193;
return r7522194;
}
\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)}\frac{1}{a} + \frac{1}{b}



Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 58.6 |
|---|---|
| Target | 14.2 |
| Herbie | 3.4 |
Initial program 58.6
Simplified34.4
Taylor expanded around 0 3.4
Final simplification3.4
herbie shell --seed 2019101 +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))))