wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;x \le 6.814864601083122 \cdot 10^{-38}:\\
\;\;\;\;\mathsf{fma}\left(wj, wj, x\right) - \left(wj + wj\right) \cdot x\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(1, wj, \left(e^{wj} - wj \cdot e^{wj}\right) \cdot \left(-\frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}\right)\right) + \mathsf{fma}\left(-\left(e^{wj} - wj \cdot e^{wj}\right), \frac{wj \cdot e^{wj} - x}{\frac{\left(e^{wj} \cdot e^{wj}\right) \cdot \left(e^{wj} \cdot e^{wj}\right) - \left(\left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)\right) \cdot \left(\left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)\right)}{e^{wj} \cdot e^{wj} + \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}}, \left(e^{wj} - wj \cdot e^{wj}\right) \cdot \frac{wj \cdot e^{wj} - x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)}\right)\\
\end{array}double f(double wj, double x) {
double r7598922 = wj;
double r7598923 = exp(r7598922);
double r7598924 = r7598922 * r7598923;
double r7598925 = x;
double r7598926 = r7598924 - r7598925;
double r7598927 = r7598923 + r7598924;
double r7598928 = r7598926 / r7598927;
double r7598929 = r7598922 - r7598928;
return r7598929;
}
double f(double wj, double x) {
double r7598930 = x;
double r7598931 = 6.814864601083122e-38;
bool r7598932 = r7598930 <= r7598931;
double r7598933 = wj;
double r7598934 = fma(r7598933, r7598933, r7598930);
double r7598935 = r7598933 + r7598933;
double r7598936 = r7598935 * r7598930;
double r7598937 = r7598934 - r7598936;
double r7598938 = 1.0;
double r7598939 = exp(r7598933);
double r7598940 = r7598933 * r7598939;
double r7598941 = r7598939 - r7598940;
double r7598942 = r7598940 - r7598930;
double r7598943 = r7598939 * r7598939;
double r7598944 = r7598940 * r7598940;
double r7598945 = r7598943 - r7598944;
double r7598946 = r7598942 / r7598945;
double r7598947 = -r7598946;
double r7598948 = r7598941 * r7598947;
double r7598949 = fma(r7598938, r7598933, r7598948);
double r7598950 = -r7598941;
double r7598951 = r7598943 * r7598943;
double r7598952 = r7598944 * r7598944;
double r7598953 = r7598951 - r7598952;
double r7598954 = r7598943 + r7598944;
double r7598955 = r7598953 / r7598954;
double r7598956 = r7598942 / r7598955;
double r7598957 = r7598941 * r7598946;
double r7598958 = fma(r7598950, r7598956, r7598957);
double r7598959 = r7598949 + r7598958;
double r7598960 = r7598932 ? r7598937 : r7598959;
return r7598960;
}




Bits error versus wj




Bits error versus x
| Original | 13.7 |
|---|---|
| Target | 13.0 |
| Herbie | 1.8 |
if x < 6.814864601083122e-38Initial program 18.7
Taylor expanded around 0 2.2
Simplified2.2
if 6.814864601083122e-38 < x Initial program 0.7
rmApplied flip-+0.8
Applied associate-/r/0.8
Applied *-un-lft-identity0.8
Applied prod-diff0.8
rmApplied flip--0.8
Final simplification1.8
herbie shell --seed 2019146 +o rules:numerics
(FPCore (wj x)
:name "Jmat.Real.lambertw, newton loop step"
:herbie-target
(- wj (- (/ wj (+ wj 1)) (/ x (+ (exp wj) (* wj (exp wj))))))
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))