Average Error: 13.7 → 0.2
Time: 5.8s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le 9.293516541346027667620105505719152461097 \cdot 10^{-5}:\\ \;\;\;\;\frac{\frac{x}{wj + 1}}{e^{wj}} + \mathsf{fma}\left(wj, wj, {wj}^{4} - {wj}^{3}\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{wj \cdot wj - 1} \cdot \frac{wj - 1}{e^{wj}} + \left(wj - \frac{wj}{wj + 1}\right)\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le 9.293516541346027667620105505719152461097 \cdot 10^{-5}:\\
\;\;\;\;\frac{\frac{x}{wj + 1}}{e^{wj}} + \mathsf{fma}\left(wj, wj, {wj}^{4} - {wj}^{3}\right)\\

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

\end{array}
double f(double wj, double x) {
        double r232390 = wj;
        double r232391 = exp(r232390);
        double r232392 = r232390 * r232391;
        double r232393 = x;
        double r232394 = r232392 - r232393;
        double r232395 = r232391 + r232392;
        double r232396 = r232394 / r232395;
        double r232397 = r232390 - r232396;
        return r232397;
}

double f(double wj, double x) {
        double r232398 = wj;
        double r232399 = 9.293516541346028e-05;
        bool r232400 = r232398 <= r232399;
        double r232401 = x;
        double r232402 = 1.0;
        double r232403 = r232398 + r232402;
        double r232404 = r232401 / r232403;
        double r232405 = exp(r232398);
        double r232406 = r232404 / r232405;
        double r232407 = 4.0;
        double r232408 = pow(r232398, r232407);
        double r232409 = 3.0;
        double r232410 = pow(r232398, r232409);
        double r232411 = r232408 - r232410;
        double r232412 = fma(r232398, r232398, r232411);
        double r232413 = r232406 + r232412;
        double r232414 = r232398 * r232398;
        double r232415 = r232414 - r232402;
        double r232416 = r232401 / r232415;
        double r232417 = r232398 - r232402;
        double r232418 = r232417 / r232405;
        double r232419 = r232416 * r232418;
        double r232420 = r232398 / r232403;
        double r232421 = r232398 - r232420;
        double r232422 = r232419 + r232421;
        double r232423 = r232400 ? r232413 : r232422;
        return r232423;
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.7
Target13.1
Herbie0.2
\[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 < 9.293516541346028e-05

    1. Initial program 13.4

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

      \[\leadsto \color{blue}{\left(\frac{\frac{x}{wj + 1}}{e^{wj}} + wj\right) - \frac{wj}{wj + 1}}\]
    3. Using strategy rm
    4. Applied associate--l+6.9

      \[\leadsto \color{blue}{\frac{\frac{x}{wj + 1}}{e^{wj}} + \left(wj - \frac{wj}{wj + 1}\right)}\]
    5. Taylor expanded around 0 0.2

      \[\leadsto \frac{\frac{x}{wj + 1}}{e^{wj}} + \color{blue}{\left(\left({wj}^{4} + {wj}^{2}\right) - {wj}^{3}\right)}\]
    6. Simplified0.2

      \[\leadsto \frac{\frac{x}{wj + 1}}{e^{wj}} + \color{blue}{\mathsf{fma}\left(wj, wj, {wj}^{4} - {wj}^{3}\right)}\]

    if 9.293516541346028e-05 < wj

    1. Initial program 30.9

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

      \[\leadsto \color{blue}{\left(\frac{\frac{x}{wj + 1}}{e^{wj}} + wj\right) - \frac{wj}{wj + 1}}\]
    3. Using strategy rm
    4. Applied associate--l+1.0

      \[\leadsto \color{blue}{\frac{\frac{x}{wj + 1}}{e^{wj}} + \left(wj - \frac{wj}{wj + 1}\right)}\]
    5. Using strategy rm
    6. Applied *-un-lft-identity1.0

      \[\leadsto \frac{\frac{x}{wj + 1}}{\color{blue}{1 \cdot e^{wj}}} + \left(wj - \frac{wj}{wj + 1}\right)\]
    7. Applied flip-+1.0

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

      \[\leadsto \frac{\color{blue}{\frac{x}{wj \cdot wj - 1 \cdot 1} \cdot \left(wj - 1\right)}}{1 \cdot e^{wj}} + \left(wj - \frac{wj}{wj + 1}\right)\]
    9. Applied times-frac1.0

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

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

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

Reproduce

herbie shell --seed 2019362 +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))))))