wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
t_0 := wj \cdot e^{wj}\\
t_1 := wj - \frac{t_0 - x}{e^{wj} + t_0}\\
\mathbf{if}\;t_1 \leq -4.766364965098498:\\
\;\;\;\;wj + \frac{x \cdot e^{-wj} - wj}{wj + 1}\\
\mathbf{elif}\;t_1 \leq 2.4195265998524308 \cdot 10^{-39}:\\
\;\;\;\;\mathsf{fma}\left(wj \cdot \mathsf{fma}\left(2.5, wj, -2\right), x, \mathsf{fma}\left(wj, wj, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj + \frac{\frac{x}{e^{wj}} - wj}{\mathsf{fma}\left(wj, wj, -1\right)} \cdot \left(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
(let* ((t_0 (* wj (exp wj))) (t_1 (- wj (/ (- t_0 x) (+ (exp wj) t_0)))))
(if (<= t_1 -4.766364965098498)
(+ wj (/ (- (* x (exp (- wj))) wj) (+ wj 1.0)))
(if (<= t_1 2.4195265998524308e-39)
(fma (* wj (fma 2.5 wj -2.0)) x (fma wj wj x))
(+ wj (* (/ (- (/ x (exp wj)) wj) (fma wj wj -1.0)) (+ 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 t_0 = wj * exp(wj);
double t_1 = wj - ((t_0 - x) / (exp(wj) + t_0));
double tmp;
if (t_1 <= -4.766364965098498) {
tmp = wj + (((x * exp(-wj)) - wj) / (wj + 1.0));
} else if (t_1 <= 2.4195265998524308e-39) {
tmp = fma((wj * fma(2.5, wj, -2.0)), x, fma(wj, wj, x));
} else {
tmp = wj + ((((x / exp(wj)) - wj) / fma(wj, wj, -1.0)) * (wj + -1.0));
}
return tmp;
}




Bits error versus wj




Bits error versus x
| Original | 14.1 |
|---|---|
| Target | 13.5 |
| Herbie | 0.7 |
if (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) < -4.7663649650984983Initial program 1.1
Simplified0.1
Applied div-inv_binary640.1
Simplified0.1
if -4.7663649650984983 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) < 2.41952659985e-39Initial program 28.1
Simplified28.1
Taylor expanded in wj around 0 0.1
Simplified0.1
Taylor expanded in wj around 0 0.1
Simplified0.1
if 2.41952659985e-39 < (-.f64 wj (/.f64 (-.f64 (*.f64 wj (exp.f64 wj)) x) (+.f64 (exp.f64 wj) (*.f64 wj (exp.f64 wj))))) Initial program 5.2
Simplified2.1
Applied flip-+_binary642.2
Applied associate-/r/_binary642.2
Simplified2.2
Final simplification0.7
herbie shell --seed 2022088
(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))))))