Average Error: 13.6 → 0.3
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 7.430298569289362581259585777138099160766 \cdot 10^{-6}:\\ \;\;\;\;\left(\mathsf{fma}\left(wj, wj, {wj}^{4}\right) - {wj}^{3}\right) + \frac{\frac{x}{e^{wj}}}{1 + wj}\\ \mathbf{else}:\\ \;\;\;\;\left(wj - \frac{wj}{1 + wj}\right) + \frac{x \cdot e^{-wj}}{1 + wj}\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le 7.430298569289362581259585777138099160766 \cdot 10^{-6}:\\
\;\;\;\;\left(\mathsf{fma}\left(wj, wj, {wj}^{4}\right) - {wj}^{3}\right) + \frac{\frac{x}{e^{wj}}}{1 + wj}\\

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

\end{array}
double f(double wj, double x) {
        double r132686 = wj;
        double r132687 = exp(r132686);
        double r132688 = r132686 * r132687;
        double r132689 = x;
        double r132690 = r132688 - r132689;
        double r132691 = r132687 + r132688;
        double r132692 = r132690 / r132691;
        double r132693 = r132686 - r132692;
        return r132693;
}

double f(double wj, double x) {
        double r132694 = wj;
        double r132695 = 7.430298569289363e-06;
        bool r132696 = r132694 <= r132695;
        double r132697 = 4.0;
        double r132698 = pow(r132694, r132697);
        double r132699 = fma(r132694, r132694, r132698);
        double r132700 = 3.0;
        double r132701 = pow(r132694, r132700);
        double r132702 = r132699 - r132701;
        double r132703 = x;
        double r132704 = exp(r132694);
        double r132705 = r132703 / r132704;
        double r132706 = 1.0;
        double r132707 = r132706 + r132694;
        double r132708 = r132705 / r132707;
        double r132709 = r132702 + r132708;
        double r132710 = r132694 / r132707;
        double r132711 = r132694 - r132710;
        double r132712 = -r132694;
        double r132713 = exp(r132712);
        double r132714 = r132703 * r132713;
        double r132715 = r132714 / r132707;
        double r132716 = r132711 + r132715;
        double r132717 = r132696 ? r132709 : r132716;
        return r132717;
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.6
Target12.8
Herbie0.3
\[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 < 7.430298569289363e-06

    1. Initial program 13.1

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

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

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

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

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

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

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

    if 7.430298569289363e-06 < wj

    1. Initial program 33.8

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

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

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

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

      \[\leadsto \color{blue}{\left(wj - \frac{wj}{1 + wj}\right)} + \frac{\frac{x}{e^{wj}}}{1 + wj}\]
    7. Using strategy rm
    8. Applied div-inv1.5

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

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

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

Reproduce

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