\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}double f(double a, double b, double eps) {
double r6590793 = eps;
double r6590794 = a;
double r6590795 = b;
double r6590796 = r6590794 + r6590795;
double r6590797 = r6590796 * r6590793;
double r6590798 = exp(r6590797);
double r6590799 = 1.0;
double r6590800 = r6590798 - r6590799;
double r6590801 = r6590793 * r6590800;
double r6590802 = r6590794 * r6590793;
double r6590803 = exp(r6590802);
double r6590804 = r6590803 - r6590799;
double r6590805 = r6590795 * r6590793;
double r6590806 = exp(r6590805);
double r6590807 = r6590806 - r6590799;
double r6590808 = r6590804 * r6590807;
double r6590809 = r6590801 / r6590808;
return r6590809;
}
double f(double a, double b, double __attribute__((unused)) eps) {
double r6590810 = 1.0;
double r6590811 = a;
double r6590812 = r6590810 / r6590811;
double r6590813 = b;
double r6590814 = r6590810 / r6590813;
double r6590815 = r6590812 + r6590814;
return r6590815;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.2 |
|---|---|
| Target | 15.6 |
| Herbie | 3.4 |
Initial program 60.2
Taylor expanded around 0 57.6
Simplified57.6
Taylor expanded around 0 56.6
Simplified56.2
Taylor expanded around 0 3.4
Final simplification3.4
herbie shell --seed 2019200 +o rules:numerics
(FPCore (a b eps)
:name "expq3 (problem 3.4.2)"
:pre (and (< -1.0 eps) (< eps 1.0))
:herbie-target
(/ (+ a b) (* a b))
(/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))))