\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.re - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im
\mathsf{fma}\left(-x.im, x.re \cdot x.im + x.re \cdot x.im, x.im \cdot \left(x.re \cdot x.im + x.re \cdot x.im\right)\right) + \mathsf{fma}\left(x.im + x.re, \left(x.re - x.im\right) \cdot x.re, \left(-x.im\right) \cdot \left(x.re \cdot x.im + x.re \cdot x.im\right)\right)double f(double x_re, double x_im) {
double r8740026 = x_re;
double r8740027 = r8740026 * r8740026;
double r8740028 = x_im;
double r8740029 = r8740028 * r8740028;
double r8740030 = r8740027 - r8740029;
double r8740031 = r8740030 * r8740026;
double r8740032 = r8740026 * r8740028;
double r8740033 = r8740028 * r8740026;
double r8740034 = r8740032 + r8740033;
double r8740035 = r8740034 * r8740028;
double r8740036 = r8740031 - r8740035;
return r8740036;
}
double f(double x_re, double x_im) {
double r8740037 = x_im;
double r8740038 = -r8740037;
double r8740039 = x_re;
double r8740040 = r8740039 * r8740037;
double r8740041 = r8740040 + r8740040;
double r8740042 = r8740037 * r8740041;
double r8740043 = fma(r8740038, r8740041, r8740042);
double r8740044 = r8740037 + r8740039;
double r8740045 = r8740039 - r8740037;
double r8740046 = r8740045 * r8740039;
double r8740047 = r8740038 * r8740041;
double r8740048 = fma(r8740044, r8740046, r8740047);
double r8740049 = r8740043 + r8740048;
return r8740049;
}




Bits error versus x.re




Bits error versus x.im
| Original | 6.9 |
|---|---|
| Target | 0.3 |
| Herbie | 0.2 |
Initial program 6.9
rmApplied difference-of-squares6.9
Applied associate-*l*0.3
rmApplied prod-diff0.2
Final simplification0.2
herbie shell --seed 2019142 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, real part"
:herbie-target
(+ (* (* x.re x.re) (- x.re x.im)) (* (* x.re x.im) (- x.re (* 3 x.im))))
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im)))