Average Error: 13.5 → 1.5
Time: 13.5s
Precision: binary64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
\[\begin{array}{l} t_0 := \sqrt{1 + wj}\\ \mathsf{fma}\left(\frac{1}{t_0}, \frac{\frac{x}{e^{wj}}}{t_0}, wj \cdot wj - {wj}^{3}\right) \end{array} \]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
t_0 := \sqrt{1 + wj}\\
\mathsf{fma}\left(\frac{1}{t_0}, \frac{\frac{x}{e^{wj}}}{t_0}, wj \cdot wj - {wj}^{3}\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 (sqrt (+ 1.0 wj))))
   (fma (/ 1.0 t_0) (/ (/ x (exp wj)) t_0) (- (* wj wj) (pow wj 3.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 = sqrt((1.0 + wj));
	return fma((1.0 / t_0), ((x / exp(wj)) / t_0), ((wj * wj) - pow(wj, 3.0)));
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.5
Target12.7
Herbie1.5
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right) \]

Derivation

  1. Initial program 13.5

    \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \]
  2. Simplified12.7

    \[\leadsto \color{blue}{wj + \frac{\frac{x}{e^{wj}} - wj}{wj + 1}} \]
  3. Applied egg-rr6.8

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{\sqrt{wj + 1}}, \frac{\frac{x}{e^{wj}}}{\sqrt{wj + 1}}, -\left(\frac{wj}{wj + 1} - wj\right)\right)} \]
  4. Taylor expanded in wj around 0 1.5

    \[\leadsto \mathsf{fma}\left(\frac{1}{\sqrt{wj + 1}}, \frac{\frac{x}{e^{wj}}}{\sqrt{wj + 1}}, -\color{blue}{\left({wj}^{3} - {wj}^{2}\right)}\right) \]
  5. Simplified1.5

    \[\leadsto \mathsf{fma}\left(\frac{1}{\sqrt{wj + 1}}, \frac{\frac{x}{e^{wj}}}{\sqrt{wj + 1}}, -\color{blue}{\left({wj}^{3} - wj \cdot wj\right)}\right) \]
  6. Final simplification1.5

    \[\leadsto \mathsf{fma}\left(\frac{1}{\sqrt{1 + wj}}, \frac{\frac{x}{e^{wj}}}{\sqrt{1 + wj}}, wj \cdot wj - {wj}^{3}\right) \]

Reproduce

herbie shell --seed 2022130 
(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))))))