wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le -8.922429223447696661376437514499176950622 \cdot 10^{-9}:\\
\;\;\;\;\mathsf{fma}\left(1, wj, \left(\left(e^{wj} \cdot wj - x\right) \cdot \frac{1}{1 + wj}\right) \cdot \frac{-1}{e^{wj}}\right) + \mathsf{fma}\left(\frac{-1}{e^{wj} + e^{wj} \cdot wj}, e^{wj} \cdot wj - x, \left(e^{wj} \cdot wj - x\right) \cdot \frac{1}{e^{wj} + e^{wj} \cdot wj}\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x \cdot wj, -2, \mathsf{fma}\left(wj, wj, x\right)\right)\\
\end{array}double f(double wj, double x) {
double r10198622 = wj;
double r10198623 = exp(r10198622);
double r10198624 = r10198622 * r10198623;
double r10198625 = x;
double r10198626 = r10198624 - r10198625;
double r10198627 = r10198623 + r10198624;
double r10198628 = r10198626 / r10198627;
double r10198629 = r10198622 - r10198628;
return r10198629;
}
double f(double wj, double x) {
double r10198630 = wj;
double r10198631 = -8.922429223447697e-09;
bool r10198632 = r10198630 <= r10198631;
double r10198633 = 1.0;
double r10198634 = exp(r10198630);
double r10198635 = r10198634 * r10198630;
double r10198636 = x;
double r10198637 = r10198635 - r10198636;
double r10198638 = r10198633 + r10198630;
double r10198639 = r10198633 / r10198638;
double r10198640 = r10198637 * r10198639;
double r10198641 = -1.0;
double r10198642 = r10198641 / r10198634;
double r10198643 = r10198640 * r10198642;
double r10198644 = fma(r10198633, r10198630, r10198643);
double r10198645 = r10198634 + r10198635;
double r10198646 = r10198641 / r10198645;
double r10198647 = r10198633 / r10198645;
double r10198648 = r10198637 * r10198647;
double r10198649 = fma(r10198646, r10198637, r10198648);
double r10198650 = r10198644 + r10198649;
double r10198651 = r10198636 * r10198630;
double r10198652 = -2.0;
double r10198653 = fma(r10198630, r10198630, r10198636);
double r10198654 = fma(r10198651, r10198652, r10198653);
double r10198655 = r10198632 ? r10198650 : r10198654;
return r10198655;
}




Bits error versus wj




Bits error versus x
| Original | 13.7 |
|---|---|
| Target | 13.1 |
| Herbie | 1.5 |
if wj < -8.922429223447697e-09Initial program 5.6
rmApplied div-inv5.8
Applied *-un-lft-identity5.8
Applied prod-diff5.9
rmApplied *-un-lft-identity5.9
Applied distribute-rgt-out5.8
Applied *-un-lft-identity5.8
Applied times-frac6.0
Applied associate-*l*6.0
if -8.922429223447697e-09 < wj Initial program 13.9
Taylor expanded around 0 1.4
Simplified1.4
Final simplification1.5
herbie shell --seed 2019200 +o rules:numerics
(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))))))