wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\begin{array}{l}
\mathbf{if}\;wj \le 7.273522667070596 \cdot 10^{-05}:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(\left(wj \cdot wj\right), \left(wj \cdot wj - wj\right), \left(wj \cdot wj\right)\right)} \cdot \sqrt{\mathsf{fma}\left(\left(wj \cdot wj\right), \left(wj \cdot wj - wj\right), \left(wj \cdot wj\right)\right)} + \frac{x}{e^{wj} \cdot wj + e^{wj}}\\
\mathbf{else}:\\
\;\;\;\;wj - \frac{wj - \frac{x}{e^{wj}}}{1 + wj}\\
\end{array}double f(double wj, double x) {
double r25031110 = wj;
double r25031111 = exp(r25031110);
double r25031112 = r25031110 * r25031111;
double r25031113 = x;
double r25031114 = r25031112 - r25031113;
double r25031115 = r25031111 + r25031112;
double r25031116 = r25031114 / r25031115;
double r25031117 = r25031110 - r25031116;
return r25031117;
}
double f(double wj, double x) {
double r25031118 = wj;
double r25031119 = 7.273522667070596e-05;
bool r25031120 = r25031118 <= r25031119;
double r25031121 = r25031118 * r25031118;
double r25031122 = r25031121 - r25031118;
double r25031123 = fma(r25031121, r25031122, r25031121);
double r25031124 = sqrt(r25031123);
double r25031125 = r25031124 * r25031124;
double r25031126 = x;
double r25031127 = exp(r25031118);
double r25031128 = r25031127 * r25031118;
double r25031129 = r25031128 + r25031127;
double r25031130 = r25031126 / r25031129;
double r25031131 = r25031125 + r25031130;
double r25031132 = r25031126 / r25031127;
double r25031133 = r25031118 - r25031132;
double r25031134 = 1.0;
double r25031135 = r25031134 + r25031118;
double r25031136 = r25031133 / r25031135;
double r25031137 = r25031118 - r25031136;
double r25031138 = r25031120 ? r25031131 : r25031137;
return r25031138;
}




Bits error versus wj




Bits error versus x
| Original | 13.6 |
|---|---|
| Target | 13.1 |
| Herbie | 0.3 |
if wj < 7.273522667070596e-05Initial program 13.4
rmApplied div-sub13.4
Applied associate--r-6.8
Taylor expanded around 0 0.3
Simplified0.3
rmApplied add-sqr-sqrt0.3
if 7.273522667070596e-05 < wj Initial program 23.5
rmApplied distribute-rgt1-in23.5
Applied *-un-lft-identity23.5
Applied times-frac23.5
Applied add-cube-cbrt24.2
Applied prod-diff24.2
Simplified23.5
Simplified1.2
Final simplification0.3
herbie shell --seed 2019107 +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))))))