e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -1.924193346987677885938052739847603511691 \cdot 10^{-7}:\\
\;\;\;\;\log \left(\sqrt{e^{e^{a \cdot x} - 1}}\right) + \log \left(\sqrt{e^{e^{a \cdot x} - 1}}\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{2}, {a}^{2} \cdot {x}^{2}, \mathsf{fma}\left(\frac{1}{6}, {a}^{3} \cdot {x}^{3}, a \cdot x\right)\right)\\
\end{array}double f(double a, double x) {
double r93315 = a;
double r93316 = x;
double r93317 = r93315 * r93316;
double r93318 = exp(r93317);
double r93319 = 1.0;
double r93320 = r93318 - r93319;
return r93320;
}
double f(double a, double x) {
double r93321 = a;
double r93322 = x;
double r93323 = r93321 * r93322;
double r93324 = -1.924193346987678e-07;
bool r93325 = r93323 <= r93324;
double r93326 = exp(r93323);
double r93327 = 1.0;
double r93328 = r93326 - r93327;
double r93329 = exp(r93328);
double r93330 = sqrt(r93329);
double r93331 = log(r93330);
double r93332 = r93331 + r93331;
double r93333 = 0.5;
double r93334 = 2.0;
double r93335 = pow(r93321, r93334);
double r93336 = pow(r93322, r93334);
double r93337 = r93335 * r93336;
double r93338 = 0.16666666666666666;
double r93339 = 3.0;
double r93340 = pow(r93321, r93339);
double r93341 = pow(r93322, r93339);
double r93342 = r93340 * r93341;
double r93343 = fma(r93338, r93342, r93323);
double r93344 = fma(r93333, r93337, r93343);
double r93345 = r93325 ? r93332 : r93344;
return r93345;
}




Bits error versus a




Bits error versus x
| Original | 29.9 |
|---|---|
| Target | 0.2 |
| Herbie | 9.5 |
if (* a x) < -1.924193346987678e-07Initial program 0.2
rmApplied add-log-exp0.2
Applied add-log-exp0.2
Applied diff-log0.2
Simplified0.2
rmApplied add-sqr-sqrt0.2
Applied log-prod0.2
if -1.924193346987678e-07 < (* a x) Initial program 44.7
Taylor expanded around 0 14.2
Simplified14.2
Final simplification9.5
herbie shell --seed 2019354 +o rules:numerics
(FPCore (a x)
:name "expax (section 3.5)"
:precision binary64
:herbie-expected 14
:herbie-target
(if (< (fabs (* a x)) 0.1) (* (* a x) (+ 1 (+ (/ (* a x) 2) (/ (pow (* a x) 2) 6)))) (- (exp (* a x)) 1))
(- (exp (* a x)) 1))