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.711633286462454 \cdot 10^{-310}:\\
\;\;\;\;e^{\left(-y.re \cdot \log \left(\frac{-1}{x.re}\right)\right) - \tan^{-1}_* \frac{x.im}{x.re} \cdot y.im}\\
\mathbf{else}:\\
\;\;\;\;e^{y.re \cdot \log x.re - \tan^{-1}_* \frac{x.im}{x.re} \cdot y.im}\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r24963 = x_re;
double r24964 = r24963 * r24963;
double r24965 = x_im;
double r24966 = r24965 * r24965;
double r24967 = r24964 + r24966;
double r24968 = sqrt(r24967);
double r24969 = log(r24968);
double r24970 = y_re;
double r24971 = r24969 * r24970;
double r24972 = atan2(r24965, r24963);
double r24973 = y_im;
double r24974 = r24972 * r24973;
double r24975 = r24971 - r24974;
double r24976 = exp(r24975);
double r24977 = r24969 * r24973;
double r24978 = r24972 * r24970;
double r24979 = r24977 + r24978;
double r24980 = cos(r24979);
double r24981 = r24976 * r24980;
return r24981;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r24982 = x_re;
double r24983 = 4.71163328646245e-310;
bool r24984 = r24982 <= r24983;
double r24985 = y_re;
double r24986 = -1.0;
double r24987 = r24986 / r24982;
double r24988 = log(r24987);
double r24989 = r24985 * r24988;
double r24990 = -r24989;
double r24991 = x_im;
double r24992 = atan2(r24991, r24982);
double r24993 = y_im;
double r24994 = r24992 * r24993;
double r24995 = r24990 - r24994;
double r24996 = exp(r24995);
double r24997 = log(r24982);
double r24998 = r24985 * r24997;
double r24999 = r24998 - r24994;
double r25000 = exp(r24999);
double r25001 = r24984 ? r24996 : r25000;
return r25001;
}



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.71163328646245e-310Initial program 31.6
Taylor expanded around 0 18.1
Taylor expanded around -inf 5.7
Simplified5.7
if 4.71163328646245e-310 < x.re Initial program 34.9
Taylor expanded around 0 21.9
Taylor expanded around inf 11.7
Simplified11.7
Final simplification8.7
herbie shell --seed 2019198
(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)))))