wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 9.871262487081795119024488249000887085671 \cdot 10^{-9}:\\
\;\;\;\;\mathsf{fma}\left(wj, wj, x\right) - 2 \cdot \left(x \cdot wj\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\sqrt[3]{wj} \cdot \sqrt[3]{wj}, \sqrt[3]{wj}, \frac{wj - \frac{x}{e^{wj}}}{{wj}^{3} + 1} \cdot \left(-\mathsf{fma}\left(wj, wj, 1 - wj\right)\right)\right) + \left(\mathsf{fma}\left(wj, wj, 1 - wj\right) + \left(-\mathsf{fma}\left(wj, wj, 1 - wj\right)\right)\right) \cdot \frac{wj - \frac{x}{e^{wj}}}{{wj}^{3} + 1}\\
\end{array}double f(double wj, double x) {
double r213374 = wj;
double r213375 = exp(r213374);
double r213376 = r213374 * r213375;
double r213377 = x;
double r213378 = r213376 - r213377;
double r213379 = r213375 + r213376;
double r213380 = r213378 / r213379;
double r213381 = r213374 - r213380;
return r213381;
}
double f(double wj, double x) {
double r213382 = wj;
double r213383 = 9.871262487081795e-09;
bool r213384 = r213382 <= r213383;
double r213385 = x;
double r213386 = fma(r213382, r213382, r213385);
double r213387 = 2.0;
double r213388 = r213385 * r213382;
double r213389 = r213387 * r213388;
double r213390 = r213386 - r213389;
double r213391 = cbrt(r213382);
double r213392 = r213391 * r213391;
double r213393 = exp(r213382);
double r213394 = r213385 / r213393;
double r213395 = r213382 - r213394;
double r213396 = 3.0;
double r213397 = pow(r213382, r213396);
double r213398 = 1.0;
double r213399 = r213397 + r213398;
double r213400 = r213395 / r213399;
double r213401 = r213398 - r213382;
double r213402 = fma(r213382, r213382, r213401);
double r213403 = -r213402;
double r213404 = r213400 * r213403;
double r213405 = fma(r213392, r213391, r213404);
double r213406 = r213402 + r213403;
double r213407 = r213406 * r213400;
double r213408 = r213405 + r213407;
double r213409 = r213384 ? r213390 : r213408;
return r213409;
}




Bits error versus wj




Bits error versus x
| Original | 13.7 |
|---|---|
| Target | 13.1 |
| Herbie | 0.9 |
if wj < 9.871262487081795e-09Initial program 13.4
Simplified13.3
Taylor expanded around 0 0.8
Simplified0.8
if 9.871262487081795e-09 < wj Initial program 24.7
Simplified2.9
rmApplied flip3-+3.0
Applied associate-/r/2.9
Applied add-cube-cbrt3.9
Applied prod-diff4.0
Simplified4.0
Simplified4.0
Final simplification0.9
herbie shell --seed 2019179 +o rules:numerics
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:herbie-target
(- wj (- (/ wj (+ wj 1.0)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))