wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 7.79759099112930591 \cdot 10^{-8}:\\
\;\;\;\;\mathsf{fma}\left(wj, wj - x \cdot 2, x\right) + \left(wj \cdot x\right) \cdot \left(\left(-2\right) + 2\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\sqrt{\frac{\frac{x}{wj + 1}}{e^{wj}} + wj}, \sqrt{\frac{\frac{x}{wj + 1}}{e^{wj}} + wj}, -\frac{wj}{wj + 1}\right)\\
\end{array}double f(double wj, double x) {
double r294087 = wj;
double r294088 = exp(r294087);
double r294089 = r294087 * r294088;
double r294090 = x;
double r294091 = r294089 - r294090;
double r294092 = r294088 + r294089;
double r294093 = r294091 / r294092;
double r294094 = r294087 - r294093;
return r294094;
}
double f(double wj, double x) {
double r294095 = wj;
double r294096 = 7.797590991129306e-08;
bool r294097 = r294095 <= r294096;
double r294098 = x;
double r294099 = 2.0;
double r294100 = r294098 * r294099;
double r294101 = r294095 - r294100;
double r294102 = fma(r294095, r294101, r294098);
double r294103 = r294095 * r294098;
double r294104 = -r294099;
double r294105 = r294104 + r294099;
double r294106 = r294103 * r294105;
double r294107 = r294102 + r294106;
double r294108 = 1.0;
double r294109 = r294095 + r294108;
double r294110 = r294098 / r294109;
double r294111 = exp(r294095);
double r294112 = r294110 / r294111;
double r294113 = r294112 + r294095;
double r294114 = sqrt(r294113);
double r294115 = r294095 / r294109;
double r294116 = -r294115;
double r294117 = fma(r294114, r294114, r294116);
double r294118 = r294097 ? r294107 : r294117;
return r294118;
}




Bits error versus wj




Bits error versus x
| Original | 13.4 |
|---|---|
| Target | 12.7 |
| Herbie | 1.2 |
if wj < 7.797590991129306e-08Initial program 13.0
Simplified13.0
Taylor expanded around 0 0.8
rmApplied add-sqr-sqrt28.9
Applied prod-diff28.9
Simplified0.9
Simplified0.9
if 7.797590991129306e-08 < wj Initial program 26.1
Simplified2.7
rmApplied add-sqr-sqrt11.0
Applied fma-neg10.9
Final simplification1.2
herbie shell --seed 2020064 +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))))))