Average Error: 13.9 → 1.1
Time: 12.9s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le 1.29350030186210644 \cdot 10^{-5}:\\ \;\;\;\;wj \cdot \left(wj - x \cdot 2\right) + x\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{x}{e^{wj}} \cdot \frac{x}{e^{wj}} - wj \cdot wj}{\left(wj + 1\right) \cdot \left(\frac{x}{e^{wj}} + wj\right)} + wj\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le 1.29350030186210644 \cdot 10^{-5}:\\
\;\;\;\;wj \cdot \left(wj - x \cdot 2\right) + x\\

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

\end{array}
double f(double wj, double x) {
        double r333453 = wj;
        double r333454 = exp(r333453);
        double r333455 = r333453 * r333454;
        double r333456 = x;
        double r333457 = r333455 - r333456;
        double r333458 = r333454 + r333455;
        double r333459 = r333457 / r333458;
        double r333460 = r333453 - r333459;
        return r333460;
}

double f(double wj, double x) {
        double r333461 = wj;
        double r333462 = 1.2935003018621064e-05;
        bool r333463 = r333461 <= r333462;
        double r333464 = x;
        double r333465 = 2.0;
        double r333466 = r333464 * r333465;
        double r333467 = r333461 - r333466;
        double r333468 = r333461 * r333467;
        double r333469 = r333468 + r333464;
        double r333470 = exp(r333461);
        double r333471 = r333464 / r333470;
        double r333472 = r333471 * r333471;
        double r333473 = r333461 * r333461;
        double r333474 = r333472 - r333473;
        double r333475 = 1.0;
        double r333476 = r333461 + r333475;
        double r333477 = r333471 + r333461;
        double r333478 = r333476 * r333477;
        double r333479 = r333474 / r333478;
        double r333480 = r333479 + r333461;
        double r333481 = r333463 ? r333469 : r333480;
        return r333481;
}

Error

Bits error versus wj

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original13.9
Target13.2
Herbie1.1
\[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 < 1.2935003018621064e-05

    1. Initial program 13.4

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Simplified13.4

      \[\leadsto \color{blue}{\frac{\frac{x}{e^{wj}} - wj}{wj + 1} + wj}\]
    3. Taylor expanded around 0 0.9

      \[\leadsto \color{blue}{\left(x + {wj}^{2}\right) - 2 \cdot \left(wj \cdot x\right)}\]
    4. Simplified1.0

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

    if 1.2935003018621064e-05 < wj

    1. Initial program 36.3

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

      \[\leadsto \color{blue}{\frac{\frac{x}{e^{wj}} - wj}{wj + 1} + wj}\]
    3. Using strategy rm
    4. Applied flip--7.9

      \[\leadsto \frac{\color{blue}{\frac{\frac{x}{e^{wj}} \cdot \frac{x}{e^{wj}} - wj \cdot wj}{\frac{x}{e^{wj}} + wj}}}{wj + 1} + wj\]
    5. Applied associate-/l/7.9

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

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

Reproduce

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

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

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