wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 9.365019380480616014925110413003039866453 \cdot 10^{-5}:\\
\;\;\;\;\left(\left({wj}^{4} + {wj}^{2}\right) - {wj}^{3}\right) + \frac{\frac{x}{e^{wj}}}{1 + wj}\\
\mathbf{else}:\\
\;\;\;\;wj - \sqrt{\frac{wj - \frac{x}{e^{wj}}}{1 + wj}} \cdot \sqrt{\frac{wj - \frac{x}{e^{wj}}}{1 + wj}}\\
\end{array}double f(double wj, double x) {
double r204639 = wj;
double r204640 = exp(r204639);
double r204641 = r204639 * r204640;
double r204642 = x;
double r204643 = r204641 - r204642;
double r204644 = r204640 + r204641;
double r204645 = r204643 / r204644;
double r204646 = r204639 - r204645;
return r204646;
}
double f(double wj, double x) {
double r204647 = wj;
double r204648 = 9.365019380480616e-05;
bool r204649 = r204647 <= r204648;
double r204650 = 4.0;
double r204651 = pow(r204647, r204650);
double r204652 = 2.0;
double r204653 = pow(r204647, r204652);
double r204654 = r204651 + r204653;
double r204655 = 3.0;
double r204656 = pow(r204647, r204655);
double r204657 = r204654 - r204656;
double r204658 = x;
double r204659 = exp(r204647);
double r204660 = r204658 / r204659;
double r204661 = 1.0;
double r204662 = r204661 + r204647;
double r204663 = r204660 / r204662;
double r204664 = r204657 + r204663;
double r204665 = r204647 - r204660;
double r204666 = r204665 / r204662;
double r204667 = sqrt(r204666);
double r204668 = r204667 * r204667;
double r204669 = r204647 - r204668;
double r204670 = r204649 ? r204664 : r204669;
return r204670;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.6 |
|---|---|
| Target | 12.8 |
| Herbie | 0.4 |
if wj < 9.365019380480616e-05Initial program 13.0
Simplified13.0
rmApplied div-sub13.0
Applied associate--r-7.0
Simplified7.0
Taylor expanded around 0 0.3
if 9.365019380480616e-05 < wj Initial program 36.0
Simplified1.0
rmApplied add-sqr-sqrt4.7
Simplified4.7
Simplified4.7
Final simplification0.4
herbie shell --seed 2019235
(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))))))