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

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

\end{array}
double f(double wj, double x) {
        double r7598922 = wj;
        double r7598923 = exp(r7598922);
        double r7598924 = r7598922 * r7598923;
        double r7598925 = x;
        double r7598926 = r7598924 - r7598925;
        double r7598927 = r7598923 + r7598924;
        double r7598928 = r7598926 / r7598927;
        double r7598929 = r7598922 - r7598928;
        return r7598929;
}

double f(double wj, double x) {
        double r7598930 = x;
        double r7598931 = 6.814864601083122e-38;
        bool r7598932 = r7598930 <= r7598931;
        double r7598933 = wj;
        double r7598934 = fma(r7598933, r7598933, r7598930);
        double r7598935 = r7598933 + r7598933;
        double r7598936 = r7598935 * r7598930;
        double r7598937 = r7598934 - r7598936;
        double r7598938 = 1.0;
        double r7598939 = exp(r7598933);
        double r7598940 = r7598933 * r7598939;
        double r7598941 = r7598939 - r7598940;
        double r7598942 = r7598940 - r7598930;
        double r7598943 = r7598939 * r7598939;
        double r7598944 = r7598940 * r7598940;
        double r7598945 = r7598943 - r7598944;
        double r7598946 = r7598942 / r7598945;
        double r7598947 = -r7598946;
        double r7598948 = r7598941 * r7598947;
        double r7598949 = fma(r7598938, r7598933, r7598948);
        double r7598950 = -r7598941;
        double r7598951 = r7598943 * r7598943;
        double r7598952 = r7598944 * r7598944;
        double r7598953 = r7598951 - r7598952;
        double r7598954 = r7598943 + r7598944;
        double r7598955 = r7598953 / r7598954;
        double r7598956 = r7598942 / r7598955;
        double r7598957 = r7598941 * r7598946;
        double r7598958 = fma(r7598950, r7598956, r7598957);
        double r7598959 = r7598949 + r7598958;
        double r7598960 = r7598932 ? r7598937 : r7598959;
        return r7598960;
}

Error

Bits error versus wj

Bits error versus x

Target

Original13.7
Target13.0
Herbie1.8
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]

Derivation

  1. Split input into 2 regimes
  2. if x < 6.814864601083122e-38

    1. Initial program 18.7

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Taylor expanded around 0 2.2

      \[\leadsto \color{blue}{\left({wj}^{2} + x\right) - 2 \cdot \left(x \cdot wj\right)}\]
    3. Simplified2.2

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

    if 6.814864601083122e-38 < x

    1. Initial program 0.7

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Using strategy rm
    3. Applied flip-+0.8

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

      \[\leadsto wj - \color{blue}{\frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)} \cdot \left(e^{wj} - wj \cdot e^{wj}\right)}\]
    5. Applied *-un-lft-identity0.8

      \[\leadsto \color{blue}{1 \cdot wj} - \frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)} \cdot \left(e^{wj} - wj \cdot e^{wj}\right)\]
    6. Applied prod-diff0.8

      \[\leadsto \color{blue}{\mathsf{fma}\left(1, wj, -\left(e^{wj} - wj \cdot e^{wj}\right) \cdot \frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}\right) + \mathsf{fma}\left(-\left(e^{wj} - wj \cdot e^{wj}\right), \frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}, \left(e^{wj} - wj \cdot e^{wj}\right) \cdot \frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}\right)}\]
    7. Using strategy rm
    8. Applied flip--0.8

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

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

Reproduce

herbie shell --seed 2019146 +o rules:numerics
(FPCore (wj x)
  :name "Jmat.Real.lambertw, newton loop step"

  :herbie-target
  (- wj (- (/ wj (+ wj 1)) (/ x (+ (exp wj) (* wj (exp wj))))))

  (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))