\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({\varepsilon}^{3} \cdot b\right) \cdot \left(b \cdot b\right), \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 r112095 = eps;
double r112096 = a;
double r112097 = b;
double r112098 = r112096 + r112097;
double r112099 = r112098 * r112095;
double r112100 = exp(r112099);
double r112101 = 1.0;
double r112102 = r112100 - r112101;
double r112103 = r112095 * r112102;
double r112104 = r112096 * r112095;
double r112105 = exp(r112104);
double r112106 = r112105 - r112101;
double r112107 = r112097 * r112095;
double r112108 = exp(r112107);
double r112109 = r112108 - r112101;
double r112110 = r112106 * r112109;
double r112111 = r112103 / r112110;
return r112111;
}
double f(double a, double b, double eps) {
double r112112 = a;
double r112113 = -1.9693375139914443e+72;
bool r112114 = r112112 <= r112113;
double r112115 = 9.716140837926457e+126;
bool r112116 = r112112 <= r112115;
double r112117 = !r112116;
bool r112118 = r112114 || r112117;
double r112119 = eps;
double r112120 = b;
double r112121 = r112112 + r112120;
double r112122 = r112121 * r112119;
double r112123 = exp(r112122);
double r112124 = 1.0;
double r112125 = r112123 - r112124;
double r112126 = 3.0;
double r112127 = pow(r112125, r112126);
double r112128 = cbrt(r112127);
double r112129 = r112119 * r112128;
double r112130 = r112112 * r112119;
double r112131 = exp(r112130);
double r112132 = r112131 - r112124;
double r112133 = 0.16666666666666666;
double r112134 = pow(r112119, r112126);
double r112135 = r112134 * r112120;
double r112136 = r112120 * r112120;
double r112137 = r112135 * r112136;
double r112138 = 0.5;
double r112139 = 2.0;
double r112140 = pow(r112119, r112139);
double r112141 = pow(r112120, r112139);
double r112142 = r112140 * r112141;
double r112143 = r112119 * r112120;
double r112144 = fma(r112138, r112142, r112143);
double r112145 = fma(r112133, r112137, r112144);
double r112146 = r112132 * r112145;
double r112147 = r112129 / r112146;
double r112148 = r112119 * r112125;
double r112149 = pow(r112112, r112126);
double r112150 = r112149 * r112134;
double r112151 = pow(r112112, r112139);
double r112152 = r112151 * r112140;
double r112153 = fma(r112138, r112152, r112130);
double r112154 = fma(r112133, r112150, r112153);
double r112155 = r112120 * r112119;
double r112156 = exp(r112155);
double r112157 = r112156 - r112124;
double r112158 = r112154 * r112157;
double r112159 = r112148 / r112158;
double r112160 = r112118 ? r112147 : r112159;
return r112160;
}




Bits error versus a




Bits error versus b




Bits error versus eps
| Original | 60.2 |
|---|---|
| Target | 14.9 |
| Herbie | 53.7 |
if a < -1.9693375139914443e+72 or 9.716140837926457e+126 < a Initial program 52.9
Taylor expanded around 0 46.9
Simplified46.9
rmApplied cube-mult46.9
Applied associate-*r*46.0
rmApplied add-cbrt-cube46.1
Simplified46.1
if -1.9693375139914443e+72 < a < 9.716140837926457e+126Initial program 63.0
Taylor expanded around 0 56.5
Simplified56.5
Final simplification53.7
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))))