Average Error: 13.9 → 0.3
Time: 16.0s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 7.163764145 \cdot 10^{-16}:\\ \;\;\;\;\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{\frac{x}{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 - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 7.163764145 \cdot 10^{-16}:\\
\;\;\;\;\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{\frac{x}{e^{wj}}}{1 + wj}\\

\end{array}
double f(double wj, double x) {
        double r222129 = wj;
        double r222130 = exp(r222129);
        double r222131 = r222129 * r222130;
        double r222132 = x;
        double r222133 = r222131 - r222132;
        double r222134 = r222130 + r222131;
        double r222135 = r222133 / r222134;
        double r222136 = r222129 - r222135;
        return r222136;
}

double f(double wj, double x) {
        double r222137 = wj;
        double r222138 = exp(r222137);
        double r222139 = r222137 * r222138;
        double r222140 = x;
        double r222141 = r222139 - r222140;
        double r222142 = r222138 + r222139;
        double r222143 = r222141 / r222142;
        double r222144 = r222137 - r222143;
        double r222145 = 7.163764144569851e-16;
        bool r222146 = r222144 <= r222145;
        double r222147 = 4.0;
        double r222148 = pow(r222137, r222147);
        double r222149 = fma(r222137, r222137, r222148);
        double r222150 = 3.0;
        double r222151 = pow(r222137, r222150);
        double r222152 = r222149 - r222151;
        double r222153 = r222140 / r222138;
        double r222154 = 1.0;
        double r222155 = r222154 + r222137;
        double r222156 = r222153 / r222155;
        double r222157 = r222152 + r222156;
        double r222158 = r222137 / r222155;
        double r222159 = r222137 - r222158;
        double r222160 = r222159 + r222156;
        double r222161 = r222146 ? r222157 : r222160;
        return r222161;
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.9
Target13.2
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 (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) < 7.163764144569851e-16

    1. Initial program 18.4

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Simplified18.4

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

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

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

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

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

    if 7.163764144569851e-16 < (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))

    1. Initial program 2.7

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}} \le 7.163764145 \cdot 10^{-16}:\\ \;\;\;\;\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{\frac{x}{e^{wj}}}{1 + wj}\\ \end{array}\]

Reproduce

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