\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.969337513991444315376627752626075518669 \cdot 10^{72} \lor \neg \left(a \le 9.71614083792645651101853201912203907943 \cdot 10^{126}\right):\\
\;\;\;\;\frac{\varepsilon \cdot \sqrt[3]{{\left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}^{3}}}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \mathsf{fma}\left(\frac{1}{6}, \left(\left({\varepsilon}^{3} \cdot b\right) \cdot b\right) \cdot {\left(\sqrt[3]{b}\right)}^{3}, \mathsf{fma}\left(\frac{1}{2}, {\varepsilon}^{2} \cdot {b}^{2}, \varepsilon \cdot b\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\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 \left(e^{b \cdot \varepsilon} - 1\right)}\\
\end{array}double f(double a, double b, double eps) {
double r104705 = eps;
double r104706 = a;
double r104707 = b;
double r104708 = r104706 + r104707;
double r104709 = r104708 * r104705;
double r104710 = exp(r104709);
double r104711 = 1.0;
double r104712 = r104710 - r104711;
double r104713 = r104705 * r104712;
double r104714 = r104706 * r104705;
double r104715 = exp(r104714);
double r104716 = r104715 - r104711;
double r104717 = r104707 * r104705;
double r104718 = exp(r104717);
double r104719 = r104718 - r104711;
double r104720 = r104716 * r104719;
double r104721 = r104713 / r104720;
return r104721;
}
double f(double a, double b, double eps) {
double r104722 = a;
double r104723 = -1.9693375139914443e+72;
bool r104724 = r104722 <= r104723;
double r104725 = 9.716140837926457e+126;
bool r104726 = r104722 <= r104725;
double r104727 = !r104726;
bool r104728 = r104724 || r104727;
double r104729 = eps;
double r104730 = b;
double r104731 = r104722 + r104730;
double r104732 = r104731 * r104729;
double r104733 = exp(r104732);
double r104734 = 1.0;
double r104735 = r104733 - r104734;
double r104736 = 3.0;
double r104737 = pow(r104735, r104736);
double r104738 = cbrt(r104737);
double r104739 = r104729 * r104738;
double r104740 = r104722 * r104729;
double r104741 = exp(r104740);
double r104742 = r104741 - r104734;
double r104743 = 0.16666666666666666;
double r104744 = pow(r104729, r104736);
double r104745 = r104744 * r104730;
double r104746 = r104745 * r104730;
double r104747 = cbrt(r104730);
double r104748 = pow(r104747, r104736);
double r104749 = r104746 * r104748;
double r104750 = 0.5;
double r104751 = 2.0;
double r104752 = pow(r104729, r104751);
double r104753 = pow(r104730, r104751);
double r104754 = r104752 * r104753;
double r104755 = r104729 * r104730;
double r104756 = fma(r104750, r104754, r104755);
double r104757 = fma(r104743, r104749, r104756);
double r104758 = r104742 * r104757;
double r104759 = r104739 / r104758;
double r104760 = r104729 * r104735;
double r104761 = pow(r104722, r104736);
double r104762 = r104761 * r104744;
double r104763 = pow(r104722, r104751);
double r104764 = r104763 * r104752;
double r104765 = fma(r104750, r104764, r104740);
double r104766 = fma(r104743, r104762, r104765);
double r104767 = r104730 * r104729;
double r104768 = exp(r104767);
double r104769 = r104768 - r104734;
double r104770 = r104766 * r104769;
double r104771 = r104760 / r104770;
double r104772 = r104728 ? r104759 : r104771;
return r104772;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.2 |
|---|---|
| Target | 14.9 |
| Herbie | 53.5 |
if a < -1.9693375139914443e+72 or 9.716140837926457e+126 < a Initial program 52.9
Taylor expanded around 0 46.9
Simplified46.9
rmApplied add-cube-cbrt46.9
Applied unpow-prod-down46.9
Applied associate-*r*46.0
Simplified45.3
rmApplied add-cbrt-cube45.4
Simplified45.4
if -1.9693375139914443e+72 < a < 9.716140837926457e+126Initial program 63.0
Taylor expanded around 0 56.5
Simplified56.5
Final simplification53.5
herbie shell --seed 2020001 +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))))