\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 -3.6563033602620086 \cdot 10^{36} \lor \neg \left(a \le 2.575614997139679 \cdot 10^{-24}\right):\\
\;\;\;\;\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\log \left(e^{e^{a \cdot \varepsilon} - 1}\right) \cdot \left(\left(\sqrt{e^{b \cdot \varepsilon}} + \sqrt{1}\right) \cdot \left(\sqrt{e^{b \cdot \varepsilon}} - \sqrt{1}\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 r125149 = eps;
double r125150 = a;
double r125151 = b;
double r125152 = r125150 + r125151;
double r125153 = r125152 * r125149;
double r125154 = exp(r125153);
double r125155 = 1.0;
double r125156 = r125154 - r125155;
double r125157 = r125149 * r125156;
double r125158 = r125150 * r125149;
double r125159 = exp(r125158);
double r125160 = r125159 - r125155;
double r125161 = r125151 * r125149;
double r125162 = exp(r125161);
double r125163 = r125162 - r125155;
double r125164 = r125160 * r125163;
double r125165 = r125157 / r125164;
return r125165;
}
double f(double a, double b, double eps) {
double r125166 = a;
double r125167 = -3.6563033602620086e+36;
bool r125168 = r125166 <= r125167;
double r125169 = 2.5756149971396786e-24;
bool r125170 = r125166 <= r125169;
double r125171 = !r125170;
bool r125172 = r125168 || r125171;
double r125173 = eps;
double r125174 = b;
double r125175 = r125166 + r125174;
double r125176 = r125175 * r125173;
double r125177 = exp(r125176);
double r125178 = 1.0;
double r125179 = r125177 - r125178;
double r125180 = r125173 * r125179;
double r125181 = r125166 * r125173;
double r125182 = exp(r125181);
double r125183 = r125182 - r125178;
double r125184 = exp(r125183);
double r125185 = log(r125184);
double r125186 = r125174 * r125173;
double r125187 = exp(r125186);
double r125188 = sqrt(r125187);
double r125189 = sqrt(r125178);
double r125190 = r125188 + r125189;
double r125191 = r125188 - r125189;
double r125192 = r125190 * r125191;
double r125193 = r125185 * r125192;
double r125194 = r125180 / r125193;
double r125195 = 0.16666666666666666;
double r125196 = 3.0;
double r125197 = pow(r125166, r125196);
double r125198 = pow(r125173, r125196);
double r125199 = r125197 * r125198;
double r125200 = 0.5;
double r125201 = 2.0;
double r125202 = pow(r125166, r125201);
double r125203 = pow(r125173, r125201);
double r125204 = r125202 * r125203;
double r125205 = fma(r125200, r125204, r125181);
double r125206 = fma(r125195, r125199, r125205);
double r125207 = r125187 - r125178;
double r125208 = r125206 * r125207;
double r125209 = r125180 / r125208;
double r125210 = r125172 ? r125194 : r125209;
return r125210;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 59.4 |
|---|---|
| Target | 17.0 |
| Herbie | 58.7 |
if a < -3.6563033602620086e+36 or 2.5756149971396786e-24 < a Initial program 52.7
rmApplied add-sqr-sqrt52.7
Applied fma-neg52.7
rmApplied add-sqr-sqrt52.7
Applied add-sqr-sqrt52.7
Applied difference-of-squares52.7
rmApplied add-log-exp52.8
Simplified52.8
if -3.6563033602620086e+36 < a < 2.5756149971396786e-24Initial program 63.9
Taylor expanded around 0 62.6
Simplified62.6
Final simplification58.7
herbie shell --seed 2020024 +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))))