wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \leq -4.62645130249213 \cdot 10^{-6}:\\
\;\;\;\;wj + \frac{\mathsf{fma}\left(wj, wj, -1\right) \cdot \left(\frac{x}{e^{wj}} - wj\right)}{\mathsf{fma}\left(wj, wj, -1\right) \cdot \left(wj + 1\right)}\\
\mathbf{elif}\;wj \leq 9.727382200534923 \cdot 10^{-10}:\\
\;\;\;\;\left(\mathsf{fma}\left(wj, wj, x\right) + x \cdot \mathsf{fma}\left(wj, \mathsf{fma}\left(2.5, wj, -2\right), {wj}^{3} \cdot -2.6666666666666665\right)\right) - {wj}^{3}\\
\mathbf{else}:\\
\;\;\;\;wj + \left(\frac{x}{e^{wj} \cdot \left(wj + 1\right)} - \frac{wj}{wj + 1}\right)\\
\end{array}
(FPCore (wj x) :precision binary64 (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))
(FPCore (wj x)
:precision binary64
(if (<= wj -4.62645130249213e-6)
(+
wj
(/
(* (fma wj wj -1.0) (- (/ x (exp wj)) wj))
(* (fma wj wj -1.0) (+ wj 1.0))))
(if (<= wj 9.727382200534923e-10)
(-
(+
(fma wj wj x)
(* x (fma wj (fma 2.5 wj -2.0) (* (pow wj 3.0) -2.6666666666666665))))
(pow wj 3.0))
(+ wj (- (/ x (* (exp wj) (+ wj 1.0))) (/ wj (+ wj 1.0)))))))double code(double wj, double x) {
return wj - (((wj * exp(wj)) - x) / (exp(wj) + (wj * exp(wj))));
}
double code(double wj, double x) {
double tmp;
if (wj <= -4.62645130249213e-6) {
tmp = wj + ((fma(wj, wj, -1.0) * ((x / exp(wj)) - wj)) / (fma(wj, wj, -1.0) * (wj + 1.0)));
} else if (wj <= 9.727382200534923e-10) {
tmp = (fma(wj, wj, x) + (x * fma(wj, fma(2.5, wj, -2.0), (pow(wj, 3.0) * -2.6666666666666665)))) - pow(wj, 3.0);
} else {
tmp = wj + ((x / (exp(wj) * (wj + 1.0))) - (wj / (wj + 1.0)));
}
return tmp;
}




Bits error versus wj




Bits error versus x
| Original | 13.7 |
|---|---|
| Target | 13.1 |
| Herbie | 0.2 |
if wj < -4.6264513024921298e-6Initial program 2.2
Simplified2.1
Applied flip-+_binary642.5
Applied associate-/r/_binary642.4
Simplified2.4
Applied flip--_binary642.5
Applied frac-times_binary642.3
Simplified2.3
if -4.6264513024921298e-6 < wj < 9.72738220053492348e-10Initial program 13.5
Simplified13.5
Taylor expanded in wj around 0 0.0
Simplified0.0
Applied fma-udef_binary640.0
Applied associate--r+_binary640.0
Simplified0.0
if 9.72738220053492348e-10 < wj Initial program 25.4
Simplified3.2
Applied div-sub_binary643.2
Simplified3.4
Final simplification0.2
herbie shell --seed 2022019
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:precision binary64
:herbie-target
(- wj (- (/ wj (+ wj 1.0)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))