\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 r4170663 = eps;
double r4170664 = a;
double r4170665 = b;
double r4170666 = r4170664 + r4170665;
double r4170667 = r4170666 * r4170663;
double r4170668 = exp(r4170667);
double r4170669 = 1.0;
double r4170670 = r4170668 - r4170669;
double r4170671 = r4170663 * r4170670;
double r4170672 = r4170664 * r4170663;
double r4170673 = exp(r4170672);
double r4170674 = r4170673 - r4170669;
double r4170675 = r4170665 * r4170663;
double r4170676 = exp(r4170675);
double r4170677 = r4170676 - r4170669;
double r4170678 = r4170674 * r4170677;
double r4170679 = r4170671 / r4170678;
return r4170679;
}
double f(double a, double b, double __attribute__((unused)) eps) {
double r4170680 = 1.0;
double r4170681 = a;
double r4170682 = r4170680 / r4170681;
double r4170683 = b;
double r4170684 = r4170680 / r4170683;
double r4170685 = r4170682 + r4170684;
return r4170685;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 58.7 |
|---|---|
| Target | 14.5 |
| Herbie | 3.3 |
Initial program 58.7
Simplified28.1
Taylor expanded around 0 3.3
Final simplification3.3
herbie shell --seed 2019162 +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))))