wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 1.29350030186210644 \cdot 10^{-5}:\\
\;\;\;\;wj \cdot \left(wj - x \cdot 2\right) + x\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{x}{e^{wj}} \cdot \frac{x}{e^{wj}} - wj \cdot wj}{\left(wj + 1\right) \cdot \left(\frac{x}{e^{wj}} + wj\right)} + wj\\
\end{array}double f(double wj, double x) {
double r333453 = wj;
double r333454 = exp(r333453);
double r333455 = r333453 * r333454;
double r333456 = x;
double r333457 = r333455 - r333456;
double r333458 = r333454 + r333455;
double r333459 = r333457 / r333458;
double r333460 = r333453 - r333459;
return r333460;
}
double f(double wj, double x) {
double r333461 = wj;
double r333462 = 1.2935003018621064e-05;
bool r333463 = r333461 <= r333462;
double r333464 = x;
double r333465 = 2.0;
double r333466 = r333464 * r333465;
double r333467 = r333461 - r333466;
double r333468 = r333461 * r333467;
double r333469 = r333468 + r333464;
double r333470 = exp(r333461);
double r333471 = r333464 / r333470;
double r333472 = r333471 * r333471;
double r333473 = r333461 * r333461;
double r333474 = r333472 - r333473;
double r333475 = 1.0;
double r333476 = r333461 + r333475;
double r333477 = r333471 + r333461;
double r333478 = r333476 * r333477;
double r333479 = r333474 / r333478;
double r333480 = r333479 + r333461;
double r333481 = r333463 ? r333469 : r333480;
return r333481;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.9 |
|---|---|
| Target | 13.2 |
| Herbie | 1.1 |
if wj < 1.2935003018621064e-05Initial program 13.4
Simplified13.4
Taylor expanded around 0 0.9
Simplified1.0
if 1.2935003018621064e-05 < wj Initial program 36.3
Simplified1.7
rmApplied flip--7.9
Applied associate-/l/7.9
Final simplification1.1
herbie shell --seed 2020045
(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))))))