Average Error: 13.6 → 1.0
Time: 1.1m
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le 6.82905740885949 \cdot 10^{-09}:\\ \;\;\;\;(\left((x \cdot -2 + wj)_*\right) \cdot wj + x)_*\\ \mathbf{else}:\\ \;\;\;\;wj - \frac{wj - \frac{x}{e^{wj}}}{wj + 1}\\ \end{array}\]
double f(double wj, double x) {
        double r32624253 = wj;
        double r32624254 = exp(r32624253);
        double r32624255 = r32624253 * r32624254;
        double r32624256 = x;
        double r32624257 = r32624255 - r32624256;
        double r32624258 = r32624254 + r32624255;
        double r32624259 = r32624257 / r32624258;
        double r32624260 = r32624253 - r32624259;
        return r32624260;
}

double f(double wj, double x) {
        double r32624261 = wj;
        double r32624262 = 6.82905740885949e-09;
        bool r32624263 = r32624261 <= r32624262;
        double r32624264 = x;
        double r32624265 = -2.0;
        double r32624266 = fma(r32624264, r32624265, r32624261);
        double r32624267 = fma(r32624266, r32624261, r32624264);
        double r32624268 = exp(r32624261);
        double r32624269 = r32624264 / r32624268;
        double r32624270 = r32624261 - r32624269;
        double r32624271 = 1.0;
        double r32624272 = r32624261 + r32624271;
        double r32624273 = r32624270 / r32624272;
        double r32624274 = r32624261 - r32624273;
        double r32624275 = r32624263 ? r32624267 : r32624274;
        return r32624275;
}

wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le 6.82905740885949 \cdot 10^{-09}:\\
\;\;\;\;(\left((x \cdot -2 + wj)_*\right) \cdot wj + x)_*\\

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

\end{array}

Error

Bits error versus wj

Bits error versus x

Target

Original13.6
Target13.0
Herbie1.0
\[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 < 6.82905740885949e-09

    1. Initial program 13.3

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

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

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

    if 6.82905740885949e-09 < wj

    1. Initial program 24.6

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt33.5

      \[\leadsto wj - \color{blue}{\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}} \cdot \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}}\]
    4. Applied add-cube-cbrt34.0

      \[\leadsto \color{blue}{\left(\sqrt[3]{wj} \cdot \sqrt[3]{wj}\right) \cdot \sqrt[3]{wj}} - \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}} \cdot \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\]
    5. Applied prod-diff34.0

      \[\leadsto \color{blue}{(\left(\sqrt[3]{wj} \cdot \sqrt[3]{wj}\right) \cdot \left(\sqrt[3]{wj}\right) + \left(-\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}} \cdot \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right))_* + (\left(-\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right) \cdot \left(\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right) + \left(\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}} \cdot \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right))_*}\]
    6. Simplified33.3

      \[\leadsto \color{blue}{\left(wj - \frac{wj - \frac{x}{e^{wj}}}{1 + wj}\right)} + (\left(-\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right) \cdot \left(\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right) + \left(\sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}} \cdot \sqrt{\frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}}\right))_*\]
    7. Simplified2.5

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

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

Reproduce

herbie shell --seed 2019101 +o rules:numerics
(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))))))