Average Error: 13.9 → 1.6
Time: 11.9s
Precision: 64
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le \frac{-7339392058136959}{1208925819614629174706176}:\\ \;\;\;\;\left(\frac{\frac{x}{\sqrt[3]{e^{wj}} \cdot \sqrt[3]{e^{wj}}}}{\sqrt[3]{e^{wj}}} - wj\right) \cdot \frac{1}{wj + 1} + wj\\ \mathbf{else}:\\ \;\;\;\;\left(x + {wj}^{2}\right) - 2 \cdot \left(wj \cdot x\right)\\ \end{array}\]
wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}
\begin{array}{l}
\mathbf{if}\;wj \le \frac{-7339392058136959}{1208925819614629174706176}:\\
\;\;\;\;\left(\frac{\frac{x}{\sqrt[3]{e^{wj}} \cdot \sqrt[3]{e^{wj}}}}{\sqrt[3]{e^{wj}}} - wj\right) \cdot \frac{1}{wj + 1} + wj\\

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

\end{array}
double f(double wj, double x) {
        double r229778 = wj;
        double r229779 = exp(r229778);
        double r229780 = r229778 * r229779;
        double r229781 = x;
        double r229782 = r229780 - r229781;
        double r229783 = r229779 + r229780;
        double r229784 = r229782 / r229783;
        double r229785 = r229778 - r229784;
        return r229785;
}

double f(double wj, double x) {
        double r229786 = wj;
        double r229787 = -7339392058136959.0;
        double r229788 = 1.2089258196146292e+24;
        double r229789 = r229787 / r229788;
        bool r229790 = r229786 <= r229789;
        double r229791 = x;
        double r229792 = exp(r229786);
        double r229793 = cbrt(r229792);
        double r229794 = r229793 * r229793;
        double r229795 = r229791 / r229794;
        double r229796 = r229795 / r229793;
        double r229797 = r229796 - r229786;
        double r229798 = 1.0;
        double r229799 = r229786 + r229798;
        double r229800 = r229798 / r229799;
        double r229801 = r229797 * r229800;
        double r229802 = r229801 + r229786;
        double r229803 = 2.0;
        double r229804 = pow(r229786, r229803);
        double r229805 = r229791 + r229804;
        double r229806 = r229786 * r229791;
        double r229807 = r229803 * r229806;
        double r229808 = r229805 - r229807;
        double r229809 = r229790 ? r229802 : r229808;
        return r229809;
}

Error

Bits error versus wj

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original13.9
Target13.3
Herbie1.6
\[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.071002818416556e-09

    1. Initial program 5.2

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

      \[\leadsto \color{blue}{\left(\frac{x}{e^{wj}} - wj\right) \cdot \frac{1}{wj + 1} + wj}\]
    3. Using strategy rm
    4. Applied add-cube-cbrt6.0

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

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

    if -6.071002818416556e-09 < wj

    1. Initial program 14.1

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj \le \frac{-7339392058136959}{1208925819614629174706176}:\\ \;\;\;\;\left(\frac{\frac{x}{\sqrt[3]{e^{wj}} \cdot \sqrt[3]{e^{wj}}}}{\sqrt[3]{e^{wj}}} - wj\right) \cdot \frac{1}{wj + 1} + wj\\ \mathbf{else}:\\ \;\;\;\;\left(x + {wj}^{2}\right) - 2 \cdot \left(wj \cdot x\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019304 
(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))))))