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 \sin \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)\frac{\sin \left(\mathsf{fma}\left(y.im, \left(\log \left(\mathsf{hypot}\left(x.re, x.im\right)\right)\right), \left(\tan^{-1}_* \frac{x.im}{x.re} \cdot y.re\right)\right)\right)}{e^{\tan^{-1}_* \frac{x.im}{x.re} \cdot y.im - y.re \cdot \log \left(\mathsf{hypot}\left(x.re, x.im\right)\right)}}double f(double x_re, double x_im, double y_re, double y_im) {
double r362042 = x_re;
double r362043 = r362042 * r362042;
double r362044 = x_im;
double r362045 = r362044 * r362044;
double r362046 = r362043 + r362045;
double r362047 = sqrt(r362046);
double r362048 = log(r362047);
double r362049 = y_re;
double r362050 = r362048 * r362049;
double r362051 = atan2(r362044, r362042);
double r362052 = y_im;
double r362053 = r362051 * r362052;
double r362054 = r362050 - r362053;
double r362055 = exp(r362054);
double r362056 = r362048 * r362052;
double r362057 = r362051 * r362049;
double r362058 = r362056 + r362057;
double r362059 = sin(r362058);
double r362060 = r362055 * r362059;
return r362060;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r362061 = y_im;
double r362062 = x_re;
double r362063 = x_im;
double r362064 = hypot(r362062, r362063);
double r362065 = log(r362064);
double r362066 = atan2(r362063, r362062);
double r362067 = y_re;
double r362068 = r362066 * r362067;
double r362069 = fma(r362061, r362065, r362068);
double r362070 = sin(r362069);
double r362071 = r362066 * r362061;
double r362072 = r362067 * r362065;
double r362073 = r362071 - r362072;
double r362074 = exp(r362073);
double r362075 = r362070 / r362074;
return r362075;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
Initial program 30.6
Simplified0.1
Final simplification0.1
herbie shell --seed 2019120 +o rules:numerics
(FPCore (x.re x.im y.re y.im)
:name "powComplex, imaginary part"
(* (exp (- (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.re) (* (atan2 x.im x.re) y.im))) (sin (+ (* (log (sqrt (+ (* x.re x.re) (* x.im x.im)))) y.im) (* (atan2 x.im x.re) y.re)))))