e^{\log \left(\sqrt{x.re \cdot x.re + x.im \cdot x.im}\right) \cdot y.re - \tan^{-1}_* \frac{x.im}{x.re} \cdot y.im} \cdot \cos \left(\log \left(\sqrt{x.re \cdot x.re + x.im \cdot x.im}\right) \cdot y.im + \tan^{-1}_* \frac{x.im}{x.re} \cdot y.re\right)\begin{array}{l}
\mathbf{if}\;x.re \le -1.7421973940893 \cdot 10^{-310}:\\
\;\;\;\;e^{\log \left(-x.re\right) \cdot y.re - y.im \cdot \tan^{-1}_* \frac{x.im}{x.re}}\\
\mathbf{else}:\\
\;\;\;\;e^{\log x.re \cdot y.re - y.im \cdot \tan^{-1}_* \frac{x.im}{x.re}}\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r1063765 = x_re;
double r1063766 = r1063765 * r1063765;
double r1063767 = x_im;
double r1063768 = r1063767 * r1063767;
double r1063769 = r1063766 + r1063768;
double r1063770 = sqrt(r1063769);
double r1063771 = log(r1063770);
double r1063772 = y_re;
double r1063773 = r1063771 * r1063772;
double r1063774 = atan2(r1063767, r1063765);
double r1063775 = y_im;
double r1063776 = r1063774 * r1063775;
double r1063777 = r1063773 - r1063776;
double r1063778 = exp(r1063777);
double r1063779 = r1063771 * r1063775;
double r1063780 = r1063774 * r1063772;
double r1063781 = r1063779 + r1063780;
double r1063782 = cos(r1063781);
double r1063783 = r1063778 * r1063782;
return r1063783;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r1063784 = x_re;
double r1063785 = -1.7421973940893e-310;
bool r1063786 = r1063784 <= r1063785;
double r1063787 = -r1063784;
double r1063788 = log(r1063787);
double r1063789 = y_re;
double r1063790 = r1063788 * r1063789;
double r1063791 = y_im;
double r1063792 = x_im;
double r1063793 = atan2(r1063792, r1063784);
double r1063794 = r1063791 * r1063793;
double r1063795 = r1063790 - r1063794;
double r1063796 = exp(r1063795);
double r1063797 = log(r1063784);
double r1063798 = r1063797 * r1063789;
double r1063799 = r1063798 - r1063794;
double r1063800 = exp(r1063799);
double r1063801 = r1063786 ? r1063796 : r1063800;
return r1063801;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < -1.7421973940893e-310Initial program 30.7
Taylor expanded around 0 16.6
Taylor expanded around -inf 5.9
Simplified5.9
if -1.7421973940893e-310 < x.re Initial program 34.2
Taylor expanded around 0 21.3
Taylor expanded around inf 11.5
Simplified11.5
Final simplification8.9
herbie shell --seed 2019152
(FPCore (x.re x.im y.re y.im)
:name "powComplex, real part"
(* (exp (- (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.re) (* (atan2 x.im x.re) y.im))) (cos (+ (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.im) (* (atan2 x.im x.re) y.re)))))