wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 1.444452482119928874498494494404307012143 \cdot 10^{-11}:\\
\;\;\;\;x - \left(\left(x \cdot wj\right) \cdot 2 - wj \cdot wj\right)\\
\mathbf{else}:\\
\;\;\;\;\left(wj - \frac{wj \cdot e^{wj}}{wj \cdot e^{wj} + e^{wj}}\right) + \frac{x}{wj \cdot e^{wj} + e^{wj}}\\
\end{array}double f(double wj, double x) {
double r11184386 = wj;
double r11184387 = exp(r11184386);
double r11184388 = r11184386 * r11184387;
double r11184389 = x;
double r11184390 = r11184388 - r11184389;
double r11184391 = r11184387 + r11184388;
double r11184392 = r11184390 / r11184391;
double r11184393 = r11184386 - r11184392;
return r11184393;
}
double f(double wj, double x) {
double r11184394 = wj;
double r11184395 = 1.4444524821199289e-11;
bool r11184396 = r11184394 <= r11184395;
double r11184397 = x;
double r11184398 = r11184397 * r11184394;
double r11184399 = 2.0;
double r11184400 = r11184398 * r11184399;
double r11184401 = r11184394 * r11184394;
double r11184402 = r11184400 - r11184401;
double r11184403 = r11184397 - r11184402;
double r11184404 = exp(r11184394);
double r11184405 = r11184394 * r11184404;
double r11184406 = r11184405 + r11184404;
double r11184407 = r11184405 / r11184406;
double r11184408 = r11184394 - r11184407;
double r11184409 = r11184397 / r11184406;
double r11184410 = r11184408 + r11184409;
double r11184411 = r11184396 ? r11184403 : r11184410;
return r11184411;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.7 |
|---|---|
| Target | 13.1 |
| Herbie | 1.4 |
if wj < 1.4444524821199289e-11Initial program 13.4
Taylor expanded around 0 0.7
Simplified0.7
if 1.4444524821199289e-11 < wj Initial program 24.2
rmApplied div-sub24.2
Applied associate--r-24.2
Final simplification1.4
herbie shell --seed 2019170
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:herbie-target
(- wj (- (/ wj (+ wj 1.0)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))