wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 1.3121422791952024 \cdot 10^{-8}:\\
\;\;\;\;\left(x + {wj}^{2}\right) - 2 \cdot \left(wj \cdot x\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\sqrt[3]{\left(\frac{\frac{x}{wj \cdot wj - 1}}{\frac{e^{wj}}{wj - 1}} + wj\right) - \frac{\frac{wj}{\sqrt{wj + 1}}}{\sqrt{wj + 1}}} \cdot \sqrt[3]{\left(\frac{\frac{x}{wj \cdot wj - 1}}{\frac{e^{wj}}{wj - 1}} + wj\right) - \frac{\frac{wj}{\sqrt{wj + 1}}}{\sqrt{wj + 1}}}\right) \cdot \sqrt[3]{\left(\frac{\frac{x}{wj \cdot wj - 1}}{\frac{e^{wj}}{wj - 1}} + wj\right) - \frac{\frac{wj}{\sqrt{wj + 1}}}{\sqrt{wj + 1}}}\\
\end{array}double code(double wj, double x) {
return (wj - (((wj * exp(wj)) - x) / (exp(wj) + (wj * exp(wj)))));
}
double code(double wj, double x) {
double VAR;
if ((wj <= 1.3121422791952024e-08)) {
VAR = ((x + pow(wj, 2.0)) - (2.0 * (wj * x)));
} else {
VAR = ((cbrt(((((x / ((wj * wj) - 1.0)) / (exp(wj) / (wj - 1.0))) + wj) - ((wj / sqrt((wj + 1.0))) / sqrt((wj + 1.0))))) * cbrt(((((x / ((wj * wj) - 1.0)) / (exp(wj) / (wj - 1.0))) + wj) - ((wj / sqrt((wj + 1.0))) / sqrt((wj + 1.0)))))) * cbrt(((((x / ((wj * wj) - 1.0)) / (exp(wj) / (wj - 1.0))) + wj) - ((wj / sqrt((wj + 1.0))) / sqrt((wj + 1.0))))));
}
return VAR;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.5 |
|---|---|
| Target | 12.7 |
| Herbie | 0.9 |
if wj < 1.3121422791952024e-08Initial program 13.0
Simplified13.0
Taylor expanded around 0 0.8
if 1.3121422791952024e-08 < wj Initial program 30.9
Simplified3.3
rmApplied flip-+3.3
Applied associate-/r/3.3
Applied associate-/l*3.4
rmApplied add-sqr-sqrt3.6
Applied associate-/r*3.6
rmApplied add-cube-cbrt4.5
Simplified4.5
Simplified4.5
Final simplification0.9
herbie shell --seed 2020075
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:precision binary64
:herbie-target
(- wj (- (/ wj (+ wj 1)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))