\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 -6.317274345536705554494934198648981426267 \cdot 10^{196}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\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 -5.631940663491904405136254441698421041501 \cdot 10^{81}:\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\log \left(e^{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}\right)}\\
\mathbf{elif}\;a \le 38308603704447418368:\\
\;\;\;\;\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(\left(\sqrt[3]{e^{\left(a + b\right) \cdot \varepsilon} - 1} \cdot \sqrt[3]{e^{\left(a + b\right) \cdot \varepsilon} - 1}\right) \cdot \sqrt[3]{e^{\left(a + b\right) \cdot \varepsilon} - 1}\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \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)}\\
\end{array}double f(double a, double b, double eps) {
double r118072 = eps;
double r118073 = a;
double r118074 = b;
double r118075 = r118073 + r118074;
double r118076 = r118075 * r118072;
double r118077 = exp(r118076);
double r118078 = 1.0;
double r118079 = r118077 - r118078;
double r118080 = r118072 * r118079;
double r118081 = r118073 * r118072;
double r118082 = exp(r118081);
double r118083 = r118082 - r118078;
double r118084 = r118074 * r118072;
double r118085 = exp(r118084);
double r118086 = r118085 - r118078;
double r118087 = r118083 * r118086;
double r118088 = r118080 / r118087;
return r118088;
}
double f(double a, double b, double eps) {
double r118089 = a;
double r118090 = -6.3172743455367056e+196;
bool r118091 = r118089 <= r118090;
double r118092 = eps;
double r118093 = b;
double r118094 = r118089 + r118093;
double r118095 = r118094 * r118092;
double r118096 = exp(r118095);
double r118097 = 1.0;
double r118098 = r118096 - r118097;
double r118099 = r118092 * r118098;
double r118100 = r118097 * r118097;
double r118101 = -r118100;
double r118102 = exp(r118089);
double r118103 = 2.0;
double r118104 = r118103 * r118092;
double r118105 = pow(r118102, r118104);
double r118106 = r118101 + r118105;
double r118107 = r118089 * r118092;
double r118108 = exp(r118107);
double r118109 = r118108 + r118097;
double r118110 = r118106 / r118109;
double r118111 = 0.16666666666666666;
double r118112 = 3.0;
double r118113 = pow(r118092, r118112);
double r118114 = pow(r118093, r118112);
double r118115 = r118113 * r118114;
double r118116 = r118111 * r118115;
double r118117 = 0.5;
double r118118 = pow(r118092, r118103);
double r118119 = pow(r118093, r118103);
double r118120 = r118118 * r118119;
double r118121 = r118117 * r118120;
double r118122 = r118092 * r118093;
double r118123 = r118121 + r118122;
double r118124 = r118116 + r118123;
double r118125 = r118110 * r118124;
double r118126 = r118099 / r118125;
double r118127 = -5.631940663491904e+81;
bool r118128 = r118089 <= r118127;
double r118129 = r118108 - r118097;
double r118130 = r118093 * r118092;
double r118131 = exp(r118130);
double r118132 = r118131 - r118097;
double r118133 = r118129 * r118132;
double r118134 = exp(r118133);
double r118135 = log(r118134);
double r118136 = r118099 / r118135;
double r118137 = 3.830860370444742e+19;
bool r118138 = r118089 <= r118137;
double r118139 = pow(r118089, r118112);
double r118140 = r118139 * r118113;
double r118141 = r118111 * r118140;
double r118142 = pow(r118089, r118103);
double r118143 = r118142 * r118118;
double r118144 = r118117 * r118143;
double r118145 = r118144 + r118107;
double r118146 = r118141 + r118145;
double r118147 = r118146 * r118132;
double r118148 = r118099 / r118147;
double r118149 = cbrt(r118098);
double r118150 = r118149 * r118149;
double r118151 = r118150 * r118149;
double r118152 = r118092 * r118151;
double r118153 = r118129 * r118124;
double r118154 = r118152 / r118153;
double r118155 = r118138 ? r118148 : r118154;
double r118156 = r118128 ? r118136 : r118155;
double r118157 = r118091 ? r118126 : r118156;
return r118157;
}




Bits error versus a




Bits error versus b




Bits error versus eps
Results
| Original | 60.3 |
|---|---|
| Target | 14.3 |
| Herbie | 53.8 |
if a < -6.3172743455367056e+196Initial program 52.0
Taylor expanded around 0 40.0
rmApplied flip--40.2
Simplified41.7
if -6.3172743455367056e+196 < a < -5.631940663491904e+81Initial program 55.6
rmApplied add-log-exp55.9
if -5.631940663491904e+81 < a < 3.830860370444742e+19Initial program 63.7
Taylor expanded around 0 56.1
if 3.830860370444742e+19 < a Initial program 55.0
Taylor expanded around 0 49.8
rmApplied add-cube-cbrt49.8
Final simplification53.8
herbie shell --seed 2019347
(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))))