Average Error: 13.8 → 1.8
Time: 29.9s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;x \le 2.885737033851384 \cdot 10^{-79}:\\ \;\;\;\;x + wj \cdot \left(wj - 2 \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;wj - \frac{wj - \frac{x}{e^{wj}}}{wj \cdot \left(wj \cdot wj\right) + 1} \cdot \left(\left(wj \cdot wj - wj\right) + 1\right)\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;x \le 2.885737033851384 \cdot 10^{-79}:\\
\;\;\;\;x + wj \cdot \left(wj - 2 \cdot x\right)\\

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

\end{array}
double f(double wj, double x) {
        double r8974172 = wj;
        double r8974173 = exp(r8974172);
        double r8974174 = r8974172 * r8974173;
        double r8974175 = x;
        double r8974176 = r8974174 - r8974175;
        double r8974177 = r8974173 + r8974174;
        double r8974178 = r8974176 / r8974177;
        double r8974179 = r8974172 - r8974178;
        return r8974179;
}

double f(double wj, double x) {
        double r8974180 = x;
        double r8974181 = 2.885737033851384e-79;
        bool r8974182 = r8974180 <= r8974181;
        double r8974183 = wj;
        double r8974184 = 2.0;
        double r8974185 = r8974184 * r8974180;
        double r8974186 = r8974183 - r8974185;
        double r8974187 = r8974183 * r8974186;
        double r8974188 = r8974180 + r8974187;
        double r8974189 = exp(r8974183);
        double r8974190 = r8974180 / r8974189;
        double r8974191 = r8974183 - r8974190;
        double r8974192 = r8974183 * r8974183;
        double r8974193 = r8974183 * r8974192;
        double r8974194 = 1.0;
        double r8974195 = r8974193 + r8974194;
        double r8974196 = r8974191 / r8974195;
        double r8974197 = r8974192 - r8974183;
        double r8974198 = r8974197 + r8974194;
        double r8974199 = r8974196 * r8974198;
        double r8974200 = r8974183 - r8974199;
        double r8974201 = r8974182 ? r8974188 : r8974200;
        return r8974201;
}

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.8
Target13.2
Herbie1.8
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]

Derivation

  1. Split input into 2 regimes
  2. if x < 2.885737033851384e-79

    1. Initial program 19.2

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

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

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

    if 2.885737033851384e-79 < x

    1. Initial program 1.7

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Using strategy rm
    3. Applied *-un-lft-identity1.7

      \[\leadsto wj - \frac{wj \cdot e^{wj} - x}{\color{blue}{1 \cdot e^{wj}} + wj \cdot e^{wj}}\]
    4. Applied distribute-rgt-out1.7

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

      \[\leadsto wj - \color{blue}{\frac{\frac{wj \cdot e^{wj} - x}{e^{wj}}}{1 + wj}}\]
    6. Taylor expanded around -inf 1.1

      \[\leadsto wj - \frac{\color{blue}{wj - \frac{x}{e^{wj}}}}{1 + wj}\]
    7. Using strategy rm
    8. Applied flip3-+1.1

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

      \[\leadsto wj - \color{blue}{\frac{wj - \frac{x}{e^{wj}}}{{1}^{3} + {wj}^{3}} \cdot \left(1 \cdot 1 + \left(wj \cdot wj - 1 \cdot wj\right)\right)}\]
    10. Simplified1.1

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

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

Reproduce

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