\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, -3 \cdot \left(x.im \cdot x.re\right), {x.re}^{3}\right)double f(double x_re, double x_im) {
double r175927 = x_re;
double r175928 = r175927 * r175927;
double r175929 = x_im;
double r175930 = r175929 * r175929;
double r175931 = r175928 - r175930;
double r175932 = r175931 * r175927;
double r175933 = r175927 * r175929;
double r175934 = r175929 * r175927;
double r175935 = r175933 + r175934;
double r175936 = r175935 * r175929;
double r175937 = r175932 - r175936;
return r175937;
}
double f(double x_re, double x_im) {
double r175938 = x_im;
double r175939 = -3.0;
double r175940 = x_re;
double r175941 = r175938 * r175940;
double r175942 = r175939 * r175941;
double r175943 = 3.0;
double r175944 = pow(r175940, r175943);
double r175945 = fma(r175938, r175942, r175944);
return r175945;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.7 |
|---|---|
| Target | 0.3 |
| Herbie | 0.2 |
Initial program 7.7
Simplified0.2
Final simplification0.2
herbie shell --seed 2019325 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, real part"
:precision binary64
: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)))