\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.im + \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.re
\mathsf{fma}\left(x.im + x.re, \left(\left(x.re - x.im\right) \cdot \left(\sqrt[3]{x.im} \cdot \sqrt[3]{x.im}\right)\right) \cdot \sqrt[3]{x.im}, x.re \cdot \left(x.re \cdot x.im + x.re \cdot x.im\right)\right)double f(double x_re, double x_im) {
double r6378138 = x_re;
double r6378139 = r6378138 * r6378138;
double r6378140 = x_im;
double r6378141 = r6378140 * r6378140;
double r6378142 = r6378139 - r6378141;
double r6378143 = r6378142 * r6378140;
double r6378144 = r6378138 * r6378140;
double r6378145 = r6378140 * r6378138;
double r6378146 = r6378144 + r6378145;
double r6378147 = r6378146 * r6378138;
double r6378148 = r6378143 + r6378147;
return r6378148;
}
double f(double x_re, double x_im) {
double r6378149 = x_im;
double r6378150 = x_re;
double r6378151 = r6378149 + r6378150;
double r6378152 = r6378150 - r6378149;
double r6378153 = cbrt(r6378149);
double r6378154 = r6378153 * r6378153;
double r6378155 = r6378152 * r6378154;
double r6378156 = r6378155 * r6378153;
double r6378157 = r6378150 * r6378149;
double r6378158 = r6378157 + r6378157;
double r6378159 = r6378150 * r6378158;
double r6378160 = fma(r6378151, r6378156, r6378159);
return r6378160;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.1 |
|---|---|
| Target | 0.3 |
| Herbie | 0.8 |
Initial program 7.1
rmApplied difference-of-squares7.1
Applied associate-*l*0.3
rmApplied fma-def0.2
rmApplied add-cube-cbrt0.8
Applied associate-*r*0.8
Final simplification0.8
herbie shell --seed 2019152 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, imaginary part"
:herbie-target
(+ (* (* x.re x.im) (* 2 x.re)) (* (* x.im (- x.re x.im)) (+ x.re x.im)))
(+ (* (- (* x.re x.re) (* x.im x.im)) x.im) (* (+ (* x.re x.im) (* x.im x.re)) x.re)))