Average Error: 14.0 → 1.4
Time: 5.1m
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 6.460732948436636 \cdot 10^{-24}:\\ \;\;\;\;x + \left(wj \cdot wj - x \cdot \left(wj + wj\right)\right)\\ \mathbf{else}:\\ \;\;\;\;wj - \frac{\frac{wj \cdot e^{wj} - x}{1 + wj}}{e^{wj}}\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 6.460732948436636 \cdot 10^{-24}:\\
\;\;\;\;x + \left(wj \cdot wj - x \cdot \left(wj + wj\right)\right)\\

\mathbf{else}:\\
\;\;\;\;wj - \frac{\frac{wj \cdot e^{wj} - x}{1 + wj}}{e^{wj}}\\

\end{array}
double f(double wj, double x) {
        double r20183359 = wj;
        double r20183360 = exp(r20183359);
        double r20183361 = r20183359 * r20183360;
        double r20183362 = x;
        double r20183363 = r20183361 - r20183362;
        double r20183364 = r20183360 + r20183361;
        double r20183365 = r20183363 / r20183364;
        double r20183366 = r20183359 - r20183365;
        return r20183366;
}

double f(double wj, double x) {
        double r20183367 = wj;
        double r20183368 = exp(r20183367);
        double r20183369 = r20183367 * r20183368;
        double r20183370 = x;
        double r20183371 = r20183369 - r20183370;
        double r20183372 = r20183368 + r20183369;
        double r20183373 = r20183371 / r20183372;
        double r20183374 = r20183367 - r20183373;
        double r20183375 = 6.460732948436636e-24;
        bool r20183376 = r20183374 <= r20183375;
        double r20183377 = r20183367 * r20183367;
        double r20183378 = r20183367 + r20183367;
        double r20183379 = r20183370 * r20183378;
        double r20183380 = r20183377 - r20183379;
        double r20183381 = r20183370 + r20183380;
        double r20183382 = 1.0;
        double r20183383 = r20183382 + r20183367;
        double r20183384 = r20183371 / r20183383;
        double r20183385 = r20183384 / r20183368;
        double r20183386 = r20183367 - r20183385;
        double r20183387 = r20183376 ? r20183381 : r20183386;
        return r20183387;
}

Error

Bits error versus wj

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original14.0
Target13.3
Herbie1.4
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]

Derivation

  1. Split input into 2 regimes
  2. if (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) < 6.460732948436636e-24

    1. Initial program 18.4

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Taylor expanded around 0 0.7

      \[\leadsto \color{blue}{\left({wj}^{2} + x\right) - 2 \cdot \left(x \cdot wj\right)}\]
    3. Simplified0.7

      \[\leadsto \color{blue}{x + \left(wj \cdot wj - \left(wj + wj\right) \cdot x\right)}\]

    if 6.460732948436636e-24 < (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))

    1. Initial program 3.3

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Using strategy rm
    3. Applied distribute-rgt1-in3.3

      \[\leadsto wj - \frac{wj \cdot e^{wj} - x}{\color{blue}{\left(wj + 1\right) \cdot e^{wj}}}\]
    4. Applied associate-/r*3.3

      \[\leadsto wj - \color{blue}{\frac{\frac{wj \cdot e^{wj} - x}{wj + 1}}{e^{wj}}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.4

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 6.460732948436636 \cdot 10^{-24}:\\ \;\;\;\;x + \left(wj \cdot wj - x \cdot \left(wj + wj\right)\right)\\ \mathbf{else}:\\ \;\;\;\;wj - \frac{\frac{wj \cdot e^{wj} - x}{1 + wj}}{e^{wj}}\\ \end{array}\]

Reproduce

herbie shell --seed 2019153 
(FPCore (wj x)
  :name "Jmat.Real.lambertw, newton loop step"

  :herbie-target
  (- wj (- (/ wj (+ wj 1)) (/ x (+ (exp wj) (* wj (exp wj))))))

  (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))