\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 -7.5412878197323673 \cdot 10^{174}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \mathsf{fma}\left(\frac{1}{6}, {\varepsilon}^{3} \cdot {b}^{3}, \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2} \cdot {b}^{2}, \varepsilon \cdot b\right)\right)}\\
\mathbf{elif}\;a \le 2.34108127479914129 \cdot 10^{62}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\mathsf{fma}\left(\frac{1}{6}, {a}^{3} \cdot {\varepsilon}^{3}, \mathsf{fma}\left(\frac{1}{2}, {a}^{2} \cdot {\varepsilon}^{2}, a \cdot \varepsilon\right)\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(e^{b \cdot \varepsilon} - 1\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\frac{\mathsf{fma}\left(-1, 1, {\left(e^{a}\right)}^{\left(2 \cdot \varepsilon\right)}\right)}{e^{a \cdot \varepsilon} + 1} \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\end{array}double f(double a, double b, double eps) {
double r83870 = eps;
double r83871 = a;
double r83872 = b;
double r83873 = r83871 + r83872;
double r83874 = r83873 * r83870;
double r83875 = exp(r83874);
double r83876 = 1.0;
double r83877 = r83875 - r83876;
double r83878 = r83870 * r83877;
double r83879 = r83871 * r83870;
double r83880 = exp(r83879);
double r83881 = r83880 - r83876;
double r83882 = r83872 * r83870;
double r83883 = exp(r83882);
double r83884 = r83883 - r83876;
double r83885 = r83881 * r83884;
double r83886 = r83878 / r83885;
return r83886;
}
double f(double a, double b, double eps) {
double r83887 = a;
double r83888 = -7.541287819732367e+174;
bool r83889 = r83887 <= r83888;
double r83890 = eps;
double r83891 = b;
double r83892 = r83887 + r83891;
double r83893 = r83892 * r83890;
double r83894 = exp(r83893);
double r83895 = 1.0;
double r83896 = r83894 - r83895;
double r83897 = r83890 * r83896;
double r83898 = r83887 * r83890;
double r83899 = exp(r83898);
double r83900 = r83899 - r83895;
double r83901 = 0.16666666666666666;
double r83902 = 3.0;
double r83903 = pow(r83890, r83902);
double r83904 = pow(r83891, r83902);
double r83905 = r83903 * r83904;
double r83906 = 0.5;
double r83907 = 2.0;
double r83908 = pow(r83890, r83907);
double r83909 = pow(r83891, r83907);
double r83910 = r83908 * r83909;
double r83911 = r83890 * r83891;
double r83912 = fma(r83906, r83910, r83911);
double r83913 = fma(r83901, r83905, r83912);
double r83914 = r83900 * r83913;
double r83915 = r83897 / r83914;
double r83916 = 2.3410812747991413e+62;
bool r83917 = r83887 <= r83916;
double r83918 = pow(r83887, r83902);
double r83919 = r83918 * r83903;
double r83920 = pow(r83887, r83907);
double r83921 = r83920 * r83908;
double r83922 = fma(r83906, r83921, r83898);
double r83923 = fma(r83901, r83919, r83922);
double r83924 = r83891 * r83890;
double r83925 = exp(r83924);
double r83926 = r83925 - r83895;
double r83927 = log1p(r83926);
double r83928 = expm1(r83927);
double r83929 = r83923 * r83928;
double r83930 = r83897 / r83929;
double r83931 = -r83895;
double r83932 = exp(r83887);
double r83933 = r83907 * r83890;
double r83934 = pow(r83932, r83933);
double r83935 = fma(r83931, r83895, r83934);
double r83936 = r83899 + r83895;
double r83937 = r83935 / r83936;
double r83938 = r83937 * r83926;
double r83939 = r83897 / r83938;
double r83940 = r83917 ? r83930 : r83939;
double r83941 = r83889 ? r83915 : r83940;
return r83941;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.5 |
|---|---|
| Target | 14.9 |
| Herbie | 55.2 |
if a < -7.541287819732367e+174Initial program 50.7
Taylor expanded around 0 40.1
Simplified40.1
if -7.541287819732367e+174 < a < 2.3410812747991413e+62Initial program 62.9
Taylor expanded around 0 56.5
Simplified56.5
rmApplied expm1-log1p-u56.5
if 2.3410812747991413e+62 < a Initial program 54.2
rmApplied flip--56.6
Simplified56.6
Final simplification55.2
herbie shell --seed 2020083 +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))))