\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}\;a \le -1.267206889411900362902984551665439281678 \cdot 10^{79}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \mathsf{fma}\left(b, \varepsilon, b \cdot \left(b \cdot \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)\right)\right)}\\
\mathbf{elif}\;a \le 2.099495629580950168918988196696082401256 \cdot 10^{101}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\mathsf{fma}\left(a, \varepsilon, {\varepsilon}^{2} \cdot \left(\frac{1}{2} \cdot {a}^{2} + \left(\frac{1}{6} \cdot {a}^{3}\right) \cdot \varepsilon\right)\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \mathsf{fma}\left(b, \varepsilon, b \cdot \left(b \cdot \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r87016 = eps;
double r87017 = a;
double r87018 = b;
double r87019 = r87017 + r87018;
double r87020 = r87019 * r87016;
double r87021 = exp(r87020);
double r87022 = 1.0;
double r87023 = r87021 - r87022;
double r87024 = r87016 * r87023;
double r87025 = r87017 * r87016;
double r87026 = exp(r87025);
double r87027 = r87026 - r87022;
double r87028 = r87018 * r87016;
double r87029 = exp(r87028);
double r87030 = r87029 - r87022;
double r87031 = r87027 * r87030;
double r87032 = r87024 / r87031;
return r87032;
}
double f(double a, double b, double eps) {
double r87033 = a;
double r87034 = -1.2672068894119004e+79;
bool r87035 = r87033 <= r87034;
double r87036 = eps;
double r87037 = b;
double r87038 = r87033 + r87037;
double r87039 = r87038 * r87036;
double r87040 = exp(r87039);
double r87041 = 1.0;
double r87042 = r87040 - r87041;
double r87043 = r87036 * r87042;
double r87044 = r87033 * r87036;
double r87045 = exp(r87044);
double r87046 = r87045 - r87041;
double r87047 = 0.5;
double r87048 = 2.0;
double r87049 = pow(r87036, r87048);
double r87050 = 0.16666666666666666;
double r87051 = 3.0;
double r87052 = pow(r87036, r87051);
double r87053 = r87050 * r87052;
double r87054 = r87053 * r87037;
double r87055 = fma(r87047, r87049, r87054);
double r87056 = r87037 * r87055;
double r87057 = r87037 * r87056;
double r87058 = fma(r87037, r87036, r87057);
double r87059 = r87046 * r87058;
double r87060 = r87043 / r87059;
double r87061 = 2.0994956295809502e+101;
bool r87062 = r87033 <= r87061;
double r87063 = pow(r87033, r87048);
double r87064 = r87047 * r87063;
double r87065 = pow(r87033, r87051);
double r87066 = r87050 * r87065;
double r87067 = r87066 * r87036;
double r87068 = r87064 + r87067;
double r87069 = r87049 * r87068;
double r87070 = fma(r87033, r87036, r87069);
double r87071 = r87037 * r87036;
double r87072 = exp(r87071);
double r87073 = r87072 - r87041;
double r87074 = r87070 * r87073;
double r87075 = r87043 / r87074;
double r87076 = log1p(r87042);
double r87077 = expm1(r87076);
double r87078 = r87036 * r87077;
double r87079 = r87078 / r87059;
double r87080 = r87062 ? r87075 : r87079;
double r87081 = r87035 ? r87060 : r87080;
return r87081;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.4 |
|---|---|
| Target | 14.8 |
| Herbie | 52.4 |
if a < -1.2672068894119004e+79Initial program 53.9
Taylor expanded around 0 46.3
Simplified43.4
rmApplied unpow243.4
Applied associate-*l*42.5
Simplified42.5
if -1.2672068894119004e+79 < a < 2.0994956295809502e+101Initial program 63.2
Taylor expanded around 0 56.4
Simplified56.4
if 2.0994956295809502e+101 < a Initial program 53.4
Taylor expanded around 0 46.8
Simplified44.1
rmApplied unpow244.1
Applied associate-*l*42.6
Simplified42.6
rmApplied expm1-log1p-u42.6
Final simplification52.4
herbie shell --seed 2019325 +o rules:numerics
(FPCore (a b eps)
:name "expq3 (problem 3.4.2)"
:precision binary64
: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))))