\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 -346828314544410.562:\\
\;\;\;\;\frac{\varepsilon \cdot \frac{\left(-1 \cdot 1\right) + {\left(e^{a + b}\right)}^{\left(2 \cdot \varepsilon\right)}}{e^{\left(a + b\right) \cdot \varepsilon} + 1}}{\frac{\left(-1 \cdot 1\right) + {\left(e^{a}\right)}^{\left(2 \cdot \varepsilon\right)}}{e^{a \cdot \varepsilon} + 1} \cdot \left(\frac{1}{6} \cdot \left({\varepsilon}^{3} \cdot {b}^{3}\right) + \left(\frac{1}{2} \cdot \left({\varepsilon}^{2} \cdot {b}^{2}\right) + \varepsilon \cdot b\right)\right)}\\
\mathbf{elif}\;a \le 3.5459178958752838 \cdot 10^{64}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(\frac{1}{6} \cdot \left({a}^{3} \cdot {\varepsilon}^{3}\right) + \left(\frac{1}{2} \cdot \left({a}^{2} \cdot {\varepsilon}^{2}\right) + a \cdot \varepsilon\right)\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\\
\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(\frac{1}{6} \cdot \left(\left(\left({\varepsilon}^{3} \cdot b\right) \cdot b\right) \cdot b\right) + \left(\frac{1}{2} \cdot \left({\varepsilon}^{2} \cdot {b}^{2}\right) + \varepsilon \cdot b\right)\right)}\\
\end{array}double f(double a, double b, double eps) {
double r106681 = eps;
double r106682 = a;
double r106683 = b;
double r106684 = r106682 + r106683;
double r106685 = r106684 * r106681;
double r106686 = exp(r106685);
double r106687 = 1.0;
double r106688 = r106686 - r106687;
double r106689 = r106681 * r106688;
double r106690 = r106682 * r106681;
double r106691 = exp(r106690);
double r106692 = r106691 - r106687;
double r106693 = r106683 * r106681;
double r106694 = exp(r106693);
double r106695 = r106694 - r106687;
double r106696 = r106692 * r106695;
double r106697 = r106689 / r106696;
return r106697;
}
double f(double a, double b, double eps) {
double r106698 = a;
double r106699 = -346828314544410.56;
bool r106700 = r106698 <= r106699;
double r106701 = eps;
double r106702 = 1.0;
double r106703 = r106702 * r106702;
double r106704 = -r106703;
double r106705 = b;
double r106706 = r106698 + r106705;
double r106707 = exp(r106706);
double r106708 = 2.0;
double r106709 = r106708 * r106701;
double r106710 = pow(r106707, r106709);
double r106711 = r106704 + r106710;
double r106712 = r106706 * r106701;
double r106713 = exp(r106712);
double r106714 = r106713 + r106702;
double r106715 = r106711 / r106714;
double r106716 = r106701 * r106715;
double r106717 = exp(r106698);
double r106718 = pow(r106717, r106709);
double r106719 = r106704 + r106718;
double r106720 = r106698 * r106701;
double r106721 = exp(r106720);
double r106722 = r106721 + r106702;
double r106723 = r106719 / r106722;
double r106724 = 0.16666666666666666;
double r106725 = 3.0;
double r106726 = pow(r106701, r106725);
double r106727 = pow(r106705, r106725);
double r106728 = r106726 * r106727;
double r106729 = r106724 * r106728;
double r106730 = 0.5;
double r106731 = pow(r106701, r106708);
double r106732 = pow(r106705, r106708);
double r106733 = r106731 * r106732;
double r106734 = r106730 * r106733;
double r106735 = r106701 * r106705;
double r106736 = r106734 + r106735;
double r106737 = r106729 + r106736;
double r106738 = r106723 * r106737;
double r106739 = r106716 / r106738;
double r106740 = 3.545917895875284e+64;
bool r106741 = r106698 <= r106740;
double r106742 = r106713 - r106702;
double r106743 = r106701 * r106742;
double r106744 = pow(r106698, r106725);
double r106745 = r106744 * r106726;
double r106746 = r106724 * r106745;
double r106747 = pow(r106698, r106708);
double r106748 = r106747 * r106731;
double r106749 = r106730 * r106748;
double r106750 = r106749 + r106720;
double r106751 = r106746 + r106750;
double r106752 = r106705 * r106701;
double r106753 = exp(r106752);
double r106754 = r106753 - r106702;
double r106755 = r106751 * r106754;
double r106756 = r106743 / r106755;
double r106757 = r106721 - r106702;
double r106758 = r106726 * r106705;
double r106759 = r106758 * r106705;
double r106760 = r106759 * r106705;
double r106761 = r106724 * r106760;
double r106762 = r106761 + r106736;
double r106763 = r106757 * r106762;
double r106764 = r106743 / r106763;
double r106765 = r106741 ? r106756 : r106764;
double r106766 = r106700 ? r106739 : r106765;
return r106766;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.6 |
|---|---|
| Target | 14.7 |
| Herbie | 52.4 |
if a < -346828314544410.56Initial program 55.7
Taylor expanded around 0 49.6
rmApplied flip--50.2
Simplified51.4
rmApplied flip--51.4
Simplified45.4
if -346828314544410.56 < a < 3.545917895875284e+64Initial program 63.7
Taylor expanded around 0 56.4
if 3.545917895875284e+64 < a Initial program 55.0
Taylor expanded around 0 47.3
rmApplied unpow347.3
Applied associate-*r*46.4
Simplified45.7
Final simplification52.4
herbie shell --seed 2020018
(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))))