(FPCore (wj x) :precision binary64 (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))
(FPCore (wj x) :precision binary64 (* (fma wj wj (/ x (exp 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) {
return fma(wj, wj, (x / exp(wj))) * (1.0 / (wj + 1.0));
}
function code(wj, x) return Float64(wj - Float64(Float64(Float64(wj * exp(wj)) - x) / Float64(exp(wj) + Float64(wj * exp(wj))))) end
function code(wj, x) return Float64(fma(wj, wj, Float64(x / exp(wj))) * Float64(1.0 / Float64(wj + 1.0))) end
code[wj_, x_] := N[(wj - N[(N[(N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision] - x), $MachinePrecision] / N[(N[Exp[wj], $MachinePrecision] + N[(wj * N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[wj_, x_] := N[(N[(wj * wj + N[(x / N[Exp[wj], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] * N[(1.0 / N[(wj + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\mathsf{fma}\left(wj, wj, \frac{x}{e^{wj}}\right) \cdot \frac{1}{wj + 1}




Bits error versus wj




Bits error versus x
| Original | 13.6 |
|---|---|
| Target | 12.9 |
| Herbie | 0.0 |
Initial program 13.6
Simplified0.0
Applied egg-rr0.0
Final simplification0.0
herbie shell --seed 2022131
(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))))))