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 1.4491834582195234 \cdot 10^{-17}:\\
\;\;\;\;x + \left(wj - 2 \cdot x\right) \cdot wj\\
\mathbf{else}:\\
\;\;\;\;\frac{x}{e^{wj} + wj \cdot e^{wj}} + \left(wj - \frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}}\right)\\
\end{array}double f(double wj, double x) {
double r8034552 = wj;
double r8034553 = exp(r8034552);
double r8034554 = r8034552 * r8034553;
double r8034555 = x;
double r8034556 = r8034554 - r8034555;
double r8034557 = r8034553 + r8034554;
double r8034558 = r8034556 / r8034557;
double r8034559 = r8034552 - r8034558;
return r8034559;
}
double f(double wj, double x) {
double r8034560 = wj;
double r8034561 = exp(r8034560);
double r8034562 = r8034560 * r8034561;
double r8034563 = x;
double r8034564 = r8034562 - r8034563;
double r8034565 = r8034561 + r8034562;
double r8034566 = r8034564 / r8034565;
double r8034567 = r8034560 - r8034566;
double r8034568 = 1.4491834582195234e-17;
bool r8034569 = r8034567 <= r8034568;
double r8034570 = 2.0;
double r8034571 = r8034570 * r8034563;
double r8034572 = r8034560 - r8034571;
double r8034573 = r8034572 * r8034560;
double r8034574 = r8034563 + r8034573;
double r8034575 = r8034563 / r8034565;
double r8034576 = r8034562 / r8034565;
double r8034577 = r8034560 - r8034576;
double r8034578 = r8034575 + r8034577;
double r8034579 = r8034569 ? r8034574 : r8034578;
return r8034579;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.3 |
|---|---|
| Target | 12.6 |
| Herbie | 1.6 |
if (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) < 1.4491834582195234e-17Initial program 17.7
Taylor expanded around 0 1.0
Simplified1.0
if 1.4491834582195234e-17 < (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))) Initial program 3.0
rmApplied div-sub3.0
Applied associate--r-3.0
Final simplification1.6
herbie shell --seed 2019129
(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))))))