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 2.7722046200884 \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 r640029 = x_re;
double r640030 = r640029 * r640029;
double r640031 = x_im;
double r640032 = r640031 * r640031;
double r640033 = r640030 + r640032;
double r640034 = sqrt(r640033);
double r640035 = log(r640034);
double r640036 = y_re;
double r640037 = r640035 * r640036;
double r640038 = atan2(r640031, r640029);
double r640039 = y_im;
double r640040 = r640038 * r640039;
double r640041 = r640037 - r640040;
double r640042 = exp(r640041);
double r640043 = r640035 * r640039;
double r640044 = r640038 * r640036;
double r640045 = r640043 + r640044;
double r640046 = cos(r640045);
double r640047 = r640042 * r640046;
return r640047;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r640048 = x_re;
double r640049 = 2.7722046200884e-310;
bool r640050 = r640048 <= r640049;
double r640051 = -r640048;
double r640052 = log(r640051);
double r640053 = y_re;
double r640054 = r640052 * r640053;
double r640055 = y_im;
double r640056 = x_im;
double r640057 = atan2(r640056, r640048);
double r640058 = r640055 * r640057;
double r640059 = r640054 - r640058;
double r640060 = exp(r640059);
double r640061 = log(r640048);
double r640062 = r640061 * r640053;
double r640063 = r640062 - r640058;
double r640064 = exp(r640063);
double r640065 = r640050 ? r640060 : r640064;
return r640065;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Results
if x.re < 2.7722046200884e-310Initial program 31.6
Taylor expanded around 0 17.7
Taylor expanded around -inf 6.0
Simplified6.0
if 2.7722046200884e-310 < x.re Initial program 33.8
Taylor expanded around 0 21.9
Taylor expanded around inf 11.5
Simplified11.5
Final simplification8.8
herbie shell --seed 2019156
(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)))))