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 4.11803379523495 \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 r1448691 = x_re;
double r1448692 = r1448691 * r1448691;
double r1448693 = x_im;
double r1448694 = r1448693 * r1448693;
double r1448695 = r1448692 + r1448694;
double r1448696 = sqrt(r1448695);
double r1448697 = log(r1448696);
double r1448698 = y_re;
double r1448699 = r1448697 * r1448698;
double r1448700 = atan2(r1448693, r1448691);
double r1448701 = y_im;
double r1448702 = r1448700 * r1448701;
double r1448703 = r1448699 - r1448702;
double r1448704 = exp(r1448703);
double r1448705 = r1448697 * r1448701;
double r1448706 = r1448700 * r1448698;
double r1448707 = r1448705 + r1448706;
double r1448708 = cos(r1448707);
double r1448709 = r1448704 * r1448708;
return r1448709;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r1448710 = x_re;
double r1448711 = 4.11803379523495e-310;
bool r1448712 = r1448710 <= r1448711;
double r1448713 = -r1448710;
double r1448714 = log(r1448713);
double r1448715 = y_re;
double r1448716 = r1448714 * r1448715;
double r1448717 = y_im;
double r1448718 = x_im;
double r1448719 = atan2(r1448718, r1448710);
double r1448720 = r1448717 * r1448719;
double r1448721 = r1448716 - r1448720;
double r1448722 = exp(r1448721);
double r1448723 = log(r1448710);
double r1448724 = r1448723 * r1448715;
double r1448725 = r1448724 - r1448720;
double r1448726 = exp(r1448725);
double r1448727 = r1448712 ? r1448722 : r1448726;
return r1448727;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < 4.11803379523495e-310Initial program 30.2
Taylor expanded around 0 16.7
Taylor expanded around -inf 6.3
Simplified6.3
if 4.11803379523495e-310 < x.re Initial program 34.2
Taylor expanded around 0 22.1
Taylor expanded around inf 12.1
Simplified12.1
Final simplification9.3
herbie shell --seed 2019162
(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)))))