\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 r110063 = eps;
double r110064 = a;
double r110065 = b;
double r110066 = r110064 + r110065;
double r110067 = r110066 * r110063;
double r110068 = exp(r110067);
double r110069 = 1.0;
double r110070 = r110068 - r110069;
double r110071 = r110063 * r110070;
double r110072 = r110064 * r110063;
double r110073 = exp(r110072);
double r110074 = r110073 - r110069;
double r110075 = r110065 * r110063;
double r110076 = exp(r110075);
double r110077 = r110076 - r110069;
double r110078 = r110074 * r110077;
double r110079 = r110071 / r110078;
return r110079;
}
double f(double a, double b, double __attribute__((unused)) eps) {
double r110080 = 1.0;
double r110081 = a;
double r110082 = r110080 / r110081;
double r110083 = b;
double r110084 = r110080 / r110083;
double r110085 = r110082 + r110084;
return r110085;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.1 |
|---|---|
| Target | 15.3 |
| Herbie | 3.6 |
Initial program 60.1
Taylor expanded around 0 57.9
Simplified57.9
Taylor expanded around 0 3.6
Final simplification3.6
herbie shell --seed 2019196 +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))))