Average Error: 13.6 → 1.0
Time: 18.2s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le 1.372239400346965385374027503503547198611 \cdot 10^{-12}:\\ \;\;\;\;\mathsf{fma}\left(wj, wj, x\right) - 2 \cdot \left(wj \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;\left(wj - \frac{wj - e^{-wj} \cdot x}{1 + {wj}^{3}}\right) - \frac{wj - e^{-wj} \cdot x}{1 + {wj}^{3}} \cdot \left(wj \cdot wj - wj\right)\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le 1.372239400346965385374027503503547198611 \cdot 10^{-12}:\\
\;\;\;\;\mathsf{fma}\left(wj, wj, x\right) - 2 \cdot \left(wj \cdot x\right)\\

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

\end{array}
double f(double wj, double x) {
        double r127211 = wj;
        double r127212 = exp(r127211);
        double r127213 = r127211 * r127212;
        double r127214 = x;
        double r127215 = r127213 - r127214;
        double r127216 = r127212 + r127213;
        double r127217 = r127215 / r127216;
        double r127218 = r127211 - r127217;
        return r127218;
}

double f(double wj, double x) {
        double r127219 = wj;
        double r127220 = 1.3722394003469654e-12;
        bool r127221 = r127219 <= r127220;
        double r127222 = x;
        double r127223 = fma(r127219, r127219, r127222);
        double r127224 = 2.0;
        double r127225 = r127219 * r127222;
        double r127226 = r127224 * r127225;
        double r127227 = r127223 - r127226;
        double r127228 = -r127219;
        double r127229 = exp(r127228);
        double r127230 = r127229 * r127222;
        double r127231 = r127219 - r127230;
        double r127232 = 1.0;
        double r127233 = 3.0;
        double r127234 = pow(r127219, r127233);
        double r127235 = r127232 + r127234;
        double r127236 = r127231 / r127235;
        double r127237 = r127219 - r127236;
        double r127238 = r127219 * r127219;
        double r127239 = r127238 - r127219;
        double r127240 = r127236 * r127239;
        double r127241 = r127237 - r127240;
        double r127242 = r127221 ? r127227 : r127241;
        return r127242;
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.6
Target13.1
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 < 1.3722394003469654e-12

    1. Initial program 13.3

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

      \[\leadsto \color{blue}{wj - \frac{\frac{wj}{1} - \frac{x}{e^{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. Simplified0.9

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

    if 1.3722394003469654e-12 < wj

    1. Initial program 23.0

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Simplified5.5

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

      \[\leadsto wj - \frac{\frac{wj}{1} - \color{blue}{x \cdot \frac{1}{e^{wj}}}}{1 + wj}\]
    5. Simplified5.4

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

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

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

      \[\leadsto wj - \color{blue}{\frac{wj - x \cdot e^{-wj}}{{wj}^{3} + 1}} \cdot \left(1 \cdot 1 + \left(wj \cdot wj - 1 \cdot wj\right)\right)\]
    10. Using strategy rm
    11. Applied distribute-rgt-in5.4

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj \le 1.372239400346965385374027503503547198611 \cdot 10^{-12}:\\ \;\;\;\;\mathsf{fma}\left(wj, wj, x\right) - 2 \cdot \left(wj \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;\left(wj - \frac{wj - e^{-wj} \cdot x}{1 + {wj}^{3}}\right) - \frac{wj - e^{-wj} \cdot x}{1 + {wj}^{3}} \cdot \left(wj \cdot wj - wj\right)\\ \end{array}\]

Reproduce

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