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 6.460732948436636 \cdot 10^{-24}:\\
\;\;\;\;x + \left(wj \cdot wj - x \cdot \left(wj + wj\right)\right)\\
\mathbf{else}:\\
\;\;\;\;wj - \frac{\frac{wj \cdot e^{wj} - x}{1 + wj}}{e^{wj}}\\
\end{array}double f(double wj, double x) {
double r20183359 = wj;
double r20183360 = exp(r20183359);
double r20183361 = r20183359 * r20183360;
double r20183362 = x;
double r20183363 = r20183361 - r20183362;
double r20183364 = r20183360 + r20183361;
double r20183365 = r20183363 / r20183364;
double r20183366 = r20183359 - r20183365;
return r20183366;
}
double f(double wj, double x) {
double r20183367 = wj;
double r20183368 = exp(r20183367);
double r20183369 = r20183367 * r20183368;
double r20183370 = x;
double r20183371 = r20183369 - r20183370;
double r20183372 = r20183368 + r20183369;
double r20183373 = r20183371 / r20183372;
double r20183374 = r20183367 - r20183373;
double r20183375 = 6.460732948436636e-24;
bool r20183376 = r20183374 <= r20183375;
double r20183377 = r20183367 * r20183367;
double r20183378 = r20183367 + r20183367;
double r20183379 = r20183370 * r20183378;
double r20183380 = r20183377 - r20183379;
double r20183381 = r20183370 + r20183380;
double r20183382 = 1.0;
double r20183383 = r20183382 + r20183367;
double r20183384 = r20183371 / r20183383;
double r20183385 = r20183384 / r20183368;
double r20183386 = r20183367 - r20183385;
double r20183387 = r20183376 ? r20183381 : r20183386;
return r20183387;
}




Bits error versus wj




Bits error versus x
Results
| Original | 14.0 |
|---|---|
| Target | 13.3 |
| Herbie | 1.4 |
if (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) < 6.460732948436636e-24Initial program 18.4
Taylor expanded around 0 0.7
Simplified0.7
if 6.460732948436636e-24 < (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) Initial program 3.3
rmApplied distribute-rgt1-in3.3
Applied associate-/r*3.3
Final simplification1.4
herbie shell --seed 2019153
(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))))))