wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 1.040345947896898181868688415541157610278 \cdot 10^{-4}:\\
\;\;\;\;\left(\mathsf{fma}\left(wj, wj, {wj}^{4}\right) - {wj}^{3}\right) + \frac{\frac{x}{e^{wj}}}{1 + wj}\\
\mathbf{else}:\\
\;\;\;\;\left(\mathsf{fma}\left(\frac{wj}{\mathsf{fma}\left(wj, -wj, 1\right)}, wj - 1, wj\right) + \frac{wj}{\mathsf{fma}\left(wj, -wj, 1\right)} \cdot \left(\left(wj - 1\right) + \left(1 - wj\right)\right)\right) + \frac{\frac{x}{e^{wj}}}{1 + wj}\\
\end{array}double f(double wj, double x) {
double r240224 = wj;
double r240225 = exp(r240224);
double r240226 = r240224 * r240225;
double r240227 = x;
double r240228 = r240226 - r240227;
double r240229 = r240225 + r240226;
double r240230 = r240228 / r240229;
double r240231 = r240224 - r240230;
return r240231;
}
double f(double wj, double x) {
double r240232 = wj;
double r240233 = 0.00010403459478968982;
bool r240234 = r240232 <= r240233;
double r240235 = 4.0;
double r240236 = pow(r240232, r240235);
double r240237 = fma(r240232, r240232, r240236);
double r240238 = 3.0;
double r240239 = pow(r240232, r240238);
double r240240 = r240237 - r240239;
double r240241 = x;
double r240242 = exp(r240232);
double r240243 = r240241 / r240242;
double r240244 = 1.0;
double r240245 = r240244 + r240232;
double r240246 = r240243 / r240245;
double r240247 = r240240 + r240246;
double r240248 = -r240232;
double r240249 = fma(r240232, r240248, r240244);
double r240250 = r240232 / r240249;
double r240251 = r240232 - r240244;
double r240252 = fma(r240250, r240251, r240232);
double r240253 = r240244 - r240232;
double r240254 = r240251 + r240253;
double r240255 = r240250 * r240254;
double r240256 = r240252 + r240255;
double r240257 = r240256 + r240246;
double r240258 = r240234 ? r240247 : r240257;
return r240258;
}




Bits error versus wj




Bits error versus x
| Original | 13.6 |
|---|---|
| Target | 12.9 |
| Herbie | 0.3 |
if wj < 0.00010403459478968982Initial program 13.2
Simplified13.2
rmApplied div-sub13.2
Applied associate--r-7.1
Taylor expanded around 0 0.2
Simplified0.2
if 0.00010403459478968982 < wj Initial program 32.6
Simplified0.9
rmApplied div-sub0.9
Applied associate--r-0.9
rmApplied flip-+0.9
Applied associate-/r/0.9
Applied add-cube-cbrt2.0
Applied prod-diff2.1
Simplified0.9
Simplified0.9
Final simplification0.3
herbie shell --seed 2019351 +o rules:numerics
(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))))))