wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 4.811043021165421 \cdot 10^{-8}:\\
\;\;\;\;\frac{\frac{x}{wj + 1}}{e^{wj}} + \left(\left({wj}^{4} + {wj}^{2}\right) - {wj}^{3}\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{x}{e^{wj} \cdot \left(wj + 1\right)} + \left(wj - \frac{wj}{wj + 1}\right)\\
\end{array}double f(double wj, double x) {
double r196283 = wj;
double r196284 = exp(r196283);
double r196285 = r196283 * r196284;
double r196286 = x;
double r196287 = r196285 - r196286;
double r196288 = r196284 + r196285;
double r196289 = r196287 / r196288;
double r196290 = r196283 - r196289;
return r196290;
}
double f(double wj, double x) {
double r196291 = wj;
double r196292 = 4.811043021165421e-08;
bool r196293 = r196291 <= r196292;
double r196294 = x;
double r196295 = 1.0;
double r196296 = r196291 + r196295;
double r196297 = r196294 / r196296;
double r196298 = exp(r196291);
double r196299 = r196297 / r196298;
double r196300 = 4.0;
double r196301 = pow(r196291, r196300);
double r196302 = 2.0;
double r196303 = pow(r196291, r196302);
double r196304 = r196301 + r196303;
double r196305 = 3.0;
double r196306 = pow(r196291, r196305);
double r196307 = r196304 - r196306;
double r196308 = r196299 + r196307;
double r196309 = r196298 * r196296;
double r196310 = r196294 / r196309;
double r196311 = r196291 / r196296;
double r196312 = r196291 - r196311;
double r196313 = r196310 + r196312;
double r196314 = r196293 ? r196308 : r196313;
return r196314;
}




Bits error versus wj




Bits error versus x
Results
| Original | 13.8 |
|---|---|
| Target | 13.1 |
| Herbie | 0.3 |
if wj < 4.811043021165421e-08Initial program 13.4
Simplified13.4
rmApplied associate--l+6.9
Taylor expanded around 0 0.2
if 4.811043021165421e-08 < wj Initial program 28.7
Simplified2.3
rmApplied associate--l+2.3
rmApplied div-inv2.3
Applied associate-/l*2.3
Simplified2.3
Final simplification0.3
herbie shell --seed 2020089
(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))))))