\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}\;b \le -8.172706586072207838707531415916321028894 \cdot 10^{170}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\varepsilon \cdot \left(b + a\right)} - 1\right)}{\left(e^{\varepsilon \cdot a} - 1\right) \cdot \left(e^{\varepsilon \cdot b} - 1\right)}\\
\mathbf{elif}\;b \le 1.268045649338871518834251374950869607891 \cdot 10^{113}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\varepsilon \cdot \left(b + a\right)} - 1\right)}{\mathsf{fma}\left(\frac{1}{2}, \left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) \cdot e^{\varepsilon \cdot a}, e^{\varepsilon \cdot a} \cdot \left(\left(b \cdot \left(\left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) \cdot \varepsilon\right)\right) \cdot \frac{1}{6} + \varepsilon \cdot b\right) - \mathsf{fma}\left(b \cdot \left(\left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right)\right) \cdot \varepsilon\right), 0.1666666666666666574148081281236954964697, \mathsf{fma}\left(\left(\varepsilon \cdot b\right) \cdot \left(\varepsilon \cdot b\right), 0.5, \left(\varepsilon \cdot b\right) \cdot 1\right)\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\varepsilon \cdot \left(b + a\right)} - 1\right)}{\left(e^{\varepsilon \cdot b} - 1\right) \cdot \mathsf{fma}\left(\frac{1}{6}, \left(\left(\varepsilon \cdot a\right) \cdot \left(a \cdot a\right)\right) \cdot \left(\varepsilon \cdot \varepsilon\right), \mathsf{fma}\left(\varepsilon, a, \left(\varepsilon \cdot \varepsilon\right) \cdot \left(\left(a \cdot a\right) \cdot \frac{1}{2}\right)\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r5783986 = eps;
double r5783987 = a;
double r5783988 = b;
double r5783989 = r5783987 + r5783988;
double r5783990 = r5783989 * r5783986;
double r5783991 = exp(r5783990);
double r5783992 = 1.0;
double r5783993 = r5783991 - r5783992;
double r5783994 = r5783986 * r5783993;
double r5783995 = r5783987 * r5783986;
double r5783996 = exp(r5783995);
double r5783997 = r5783996 - r5783992;
double r5783998 = r5783988 * r5783986;
double r5783999 = exp(r5783998);
double r5784000 = r5783999 - r5783992;
double r5784001 = r5783997 * r5784000;
double r5784002 = r5783994 / r5784001;
return r5784002;
}
double f(double a, double b, double eps) {
double r5784003 = b;
double r5784004 = -8.172706586072208e+170;
bool r5784005 = r5784003 <= r5784004;
double r5784006 = eps;
double r5784007 = a;
double r5784008 = r5784003 + r5784007;
double r5784009 = r5784006 * r5784008;
double r5784010 = exp(r5784009);
double r5784011 = 1.0;
double r5784012 = r5784010 - r5784011;
double r5784013 = r5784006 * r5784012;
double r5784014 = r5784006 * r5784007;
double r5784015 = exp(r5784014);
double r5784016 = r5784015 - r5784011;
double r5784017 = r5784006 * r5784003;
double r5784018 = exp(r5784017);
double r5784019 = r5784018 - r5784011;
double r5784020 = r5784016 * r5784019;
double r5784021 = r5784013 / r5784020;
double r5784022 = 1.2680456493388715e+113;
bool r5784023 = r5784003 <= r5784022;
double r5784024 = 0.5;
double r5784025 = r5784017 * r5784017;
double r5784026 = r5784025 * r5784015;
double r5784027 = r5784025 * r5784006;
double r5784028 = r5784003 * r5784027;
double r5784029 = 0.16666666666666666;
double r5784030 = r5784028 * r5784029;
double r5784031 = r5784030 + r5784017;
double r5784032 = r5784015 * r5784031;
double r5784033 = 0.16666666666666666;
double r5784034 = 0.5;
double r5784035 = r5784017 * r5784011;
double r5784036 = fma(r5784025, r5784034, r5784035);
double r5784037 = fma(r5784028, r5784033, r5784036);
double r5784038 = r5784032 - r5784037;
double r5784039 = fma(r5784024, r5784026, r5784038);
double r5784040 = r5784013 / r5784039;
double r5784041 = r5784007 * r5784007;
double r5784042 = r5784014 * r5784041;
double r5784043 = r5784006 * r5784006;
double r5784044 = r5784042 * r5784043;
double r5784045 = r5784041 * r5784024;
double r5784046 = r5784043 * r5784045;
double r5784047 = fma(r5784006, r5784007, r5784046);
double r5784048 = fma(r5784029, r5784044, r5784047);
double r5784049 = r5784019 * r5784048;
double r5784050 = r5784013 / r5784049;
double r5784051 = r5784023 ? r5784040 : r5784050;
double r5784052 = r5784005 ? r5784021 : r5784051;
return r5784052;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.0 |
|---|---|
| Target | 15.2 |
| Herbie | 54.5 |
if b < -8.172706586072208e+170Initial program 50.5
rmApplied *-un-lft-identity50.5
Applied associate-*r*50.5
Simplified50.5
if -8.172706586072208e+170 < b < 1.2680456493388715e+113Initial program 62.4
Taylor expanded around 0 56.7
Simplified56.7
Taylor expanded around inf 57.4
Simplified56.7
if 1.2680456493388715e+113 < b Initial program 52.5
Taylor expanded around 0 46.2
Simplified45.6
Taylor expanded around 0 45.6
Simplified44.5
Final simplification54.5
herbie shell --seed 2019169 +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))))