\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}\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)} = -\infty:\\
\;\;\;\;\frac{1}{a} + \frac{1}{b}\\
\mathbf{elif}\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)} \le 1.570835326132957750197283763877702962205 \cdot 10^{-35}:\\
\;\;\;\;\frac{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right) \cdot \varepsilon}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \left(e^{\varepsilon \cdot a} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{a} + \frac{1}{b}\\
\end{array}double f(double a, double b, double eps) {
double r6000017 = eps;
double r6000018 = a;
double r6000019 = b;
double r6000020 = r6000018 + r6000019;
double r6000021 = r6000020 * r6000017;
double r6000022 = exp(r6000021);
double r6000023 = 1.0;
double r6000024 = r6000022 - r6000023;
double r6000025 = r6000017 * r6000024;
double r6000026 = r6000018 * r6000017;
double r6000027 = exp(r6000026);
double r6000028 = r6000027 - r6000023;
double r6000029 = r6000019 * r6000017;
double r6000030 = exp(r6000029);
double r6000031 = r6000030 - r6000023;
double r6000032 = r6000028 * r6000031;
double r6000033 = r6000025 / r6000032;
return r6000033;
}
double f(double a, double b, double eps) {
double r6000034 = a;
double r6000035 = b;
double r6000036 = r6000034 + r6000035;
double r6000037 = eps;
double r6000038 = r6000036 * r6000037;
double r6000039 = exp(r6000038);
double r6000040 = 1.0;
double r6000041 = r6000039 - r6000040;
double r6000042 = r6000041 * r6000037;
double r6000043 = r6000037 * r6000035;
double r6000044 = exp(r6000043);
double r6000045 = r6000044 - r6000040;
double r6000046 = r6000037 * r6000034;
double r6000047 = exp(r6000046);
double r6000048 = r6000047 - r6000040;
double r6000049 = r6000045 * r6000048;
double r6000050 = r6000042 / r6000049;
double r6000051 = -inf.0;
bool r6000052 = r6000050 <= r6000051;
double r6000053 = 1.0;
double r6000054 = r6000053 / r6000034;
double r6000055 = r6000053 / r6000035;
double r6000056 = r6000054 + r6000055;
double r6000057 = 1.5708353261329578e-35;
bool r6000058 = r6000050 <= r6000057;
double r6000059 = r6000058 ? r6000050 : r6000056;
double r6000060 = r6000052 ? r6000056 : r6000059;
return r6000060;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.4 |
|---|---|
| Target | 14.6 |
| Herbie | 0.4 |
if (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < -inf.0 or 1.5708353261329578e-35 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) Initial program 63.7
Taylor expanded around 0 58.1
Simplified57.4
Taylor expanded around 0 0.3
if -inf.0 < (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))) < 1.5708353261329578e-35Initial program 3.1
Final simplification0.4
herbie shell --seed 2019172
(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))))