wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\left(\mathsf{fma}\left(wj \cdot wj, wj \cdot wj, wj \cdot wj\right) - wj \cdot \left(wj \cdot wj\right)\right) + \frac{x}{e^{wj} \cdot e^{wj} - \left(wj \cdot e^{wj}\right) \cdot \left(wj \cdot e^{wj}\right)} \cdot \left(e^{wj} - wj \cdot e^{wj}\right)double f(double wj, double x) {
double r8257747 = wj;
double r8257748 = exp(r8257747);
double r8257749 = r8257747 * r8257748;
double r8257750 = x;
double r8257751 = r8257749 - r8257750;
double r8257752 = r8257748 + r8257749;
double r8257753 = r8257751 / r8257752;
double r8257754 = r8257747 - r8257753;
return r8257754;
}
double f(double wj, double x) {
double r8257755 = wj;
double r8257756 = r8257755 * r8257755;
double r8257757 = fma(r8257756, r8257756, r8257756);
double r8257758 = r8257755 * r8257756;
double r8257759 = r8257757 - r8257758;
double r8257760 = x;
double r8257761 = exp(r8257755);
double r8257762 = r8257761 * r8257761;
double r8257763 = r8257755 * r8257761;
double r8257764 = r8257763 * r8257763;
double r8257765 = r8257762 - r8257764;
double r8257766 = r8257760 / r8257765;
double r8257767 = r8257761 - r8257763;
double r8257768 = r8257766 * r8257767;
double r8257769 = r8257759 + r8257768;
return r8257769;
}




Bits error versus wj




Bits error versus x
| Original | 13.1 |
|---|---|
| Target | 12.4 |
| Herbie | 1.2 |
Initial program 13.1
rmApplied div-sub13.1
Applied associate--r-7.2
Taylor expanded around 0 1.1
Simplified1.1
rmApplied flip-+1.2
Applied associate-/r/1.2
Final simplification1.2
herbie shell --seed 2019168 +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))))))