\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.386196348344972242970976545867568916909 \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, \left(\sqrt{\mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)} \cdot \left|b\right|\right) \cdot \left(\sqrt{\mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)} \cdot \left|b\right|\right)\right)}\\
\mathbf{elif}\;a \le 2.610255663969723268136549668862625934183 \cdot 10^{104}:\\
\;\;\;\;\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, \left(\sqrt{\mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)} \cdot \left|b\right|\right) \cdot \left(\sqrt{\mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2}, \left(\frac{1}{6} \cdot {\varepsilon}^{3}\right) \cdot b\right)} \cdot \left|b\right|\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r89821 = eps;
double r89822 = a;
double r89823 = b;
double r89824 = r89822 + r89823;
double r89825 = r89824 * r89821;
double r89826 = exp(r89825);
double r89827 = 1.0;
double r89828 = r89826 - r89827;
double r89829 = r89821 * r89828;
double r89830 = r89822 * r89821;
double r89831 = exp(r89830);
double r89832 = r89831 - r89827;
double r89833 = r89823 * r89821;
double r89834 = exp(r89833);
double r89835 = r89834 - r89827;
double r89836 = r89832 * r89835;
double r89837 = r89829 / r89836;
return r89837;
}
double f(double a, double b, double eps) {
double r89838 = a;
double r89839 = -1.3861963483449722e+79;
bool r89840 = r89838 <= r89839;
double r89841 = eps;
double r89842 = b;
double r89843 = r89838 + r89842;
double r89844 = r89843 * r89841;
double r89845 = exp(r89844);
double r89846 = 1.0;
double r89847 = r89845 - r89846;
double r89848 = r89841 * r89847;
double r89849 = r89838 * r89841;
double r89850 = exp(r89849);
double r89851 = r89850 - r89846;
double r89852 = 0.5;
double r89853 = 2.0;
double r89854 = pow(r89841, r89853);
double r89855 = 0.16666666666666666;
double r89856 = 3.0;
double r89857 = pow(r89841, r89856);
double r89858 = r89855 * r89857;
double r89859 = r89858 * r89842;
double r89860 = fma(r89852, r89854, r89859);
double r89861 = sqrt(r89860);
double r89862 = fabs(r89842);
double r89863 = r89861 * r89862;
double r89864 = r89863 * r89863;
double r89865 = fma(r89842, r89841, r89864);
double r89866 = r89851 * r89865;
double r89867 = r89848 / r89866;
double r89868 = 2.6102556639697233e+104;
bool r89869 = r89838 <= r89868;
double r89870 = pow(r89838, r89853);
double r89871 = r89852 * r89870;
double r89872 = pow(r89838, r89856);
double r89873 = r89855 * r89872;
double r89874 = r89873 * r89841;
double r89875 = r89871 + r89874;
double r89876 = r89854 * r89875;
double r89877 = fma(r89838, r89841, r89876);
double r89878 = r89842 * r89841;
double r89879 = exp(r89878);
double r89880 = r89879 - r89846;
double r89881 = r89877 * r89880;
double r89882 = r89848 / r89881;
double r89883 = log1p(r89847);
double r89884 = expm1(r89883);
double r89885 = r89841 * r89884;
double r89886 = r89885 / r89866;
double r89887 = r89869 ? r89882 : r89886;
double r89888 = r89840 ? r89867 : r89887;
return r89888;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.4 |
|---|---|
| Target | 14.8 |
| Herbie | 52.9 |
if a < -1.3861963483449722e+79Initial program 53.9
Taylor expanded around 0 46.3
Simplified43.4
rmApplied add-sqr-sqrt45.0
Applied add-sqr-sqrt45.0
Applied unswap-sqr45.0
Simplified45.0
Simplified44.2
if -1.3861963483449722e+79 < a < 2.6102556639697233e+104Initial program 63.2
Taylor expanded around 0 56.4
Simplified56.4
if 2.6102556639697233e+104 < a Initial program 53.3
Taylor expanded around 0 46.7
Simplified44.1
rmApplied add-sqr-sqrt45.6
Applied add-sqr-sqrt45.6
Applied unswap-sqr45.6
Simplified45.6
Simplified44.1
rmApplied expm1-log1p-u44.1
Final simplification52.9
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))))