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}\;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) \le 0.9999999999863410371503391615988221019506:\\
\;\;\;\;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)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\mathsf{fma}\left(\log \left(\mathsf{hypot}\left(x.re, x.im\right)\right), y.im, \tan^{-1}_* \frac{x.im}{x.re} \cdot y.re\right)\right)\right)\right) \cdot \frac{{\left(\mathsf{hypot}\left(x.re, x.im\right)\right)}^{y.re}}{e^{\left(\log \left(e^{\sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re}}}\right) \cdot \sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re}}\right) \cdot \left(\sqrt[3]{\tan^{-1}_* \frac{x.im}{x.re}} \cdot y.im\right)}}\\
\end{array}double f(double x_re, double x_im, double y_re, double y_im) {
double r22463 = x_re;
double r22464 = r22463 * r22463;
double r22465 = x_im;
double r22466 = r22465 * r22465;
double r22467 = r22464 + r22466;
double r22468 = sqrt(r22467);
double r22469 = log(r22468);
double r22470 = y_re;
double r22471 = r22469 * r22470;
double r22472 = atan2(r22465, r22463);
double r22473 = y_im;
double r22474 = r22472 * r22473;
double r22475 = r22471 - r22474;
double r22476 = exp(r22475);
double r22477 = r22469 * r22473;
double r22478 = r22472 * r22470;
double r22479 = r22477 + r22478;
double r22480 = cos(r22479);
double r22481 = r22476 * r22480;
return r22481;
}
double f(double x_re, double x_im, double y_re, double y_im) {
double r22482 = x_re;
double r22483 = r22482 * r22482;
double r22484 = x_im;
double r22485 = r22484 * r22484;
double r22486 = r22483 + r22485;
double r22487 = sqrt(r22486);
double r22488 = log(r22487);
double r22489 = y_re;
double r22490 = r22488 * r22489;
double r22491 = atan2(r22484, r22482);
double r22492 = y_im;
double r22493 = r22491 * r22492;
double r22494 = r22490 - r22493;
double r22495 = exp(r22494);
double r22496 = r22488 * r22492;
double r22497 = r22491 * r22489;
double r22498 = r22496 + r22497;
double r22499 = cos(r22498);
double r22500 = r22495 * r22499;
double r22501 = 0.999999999986341;
bool r22502 = r22500 <= r22501;
double r22503 = hypot(r22482, r22484);
double r22504 = log(r22503);
double r22505 = fma(r22504, r22492, r22497);
double r22506 = cos(r22505);
double r22507 = log1p(r22506);
double r22508 = expm1(r22507);
double r22509 = pow(r22503, r22489);
double r22510 = cbrt(r22491);
double r22511 = exp(r22510);
double r22512 = log(r22511);
double r22513 = r22512 * r22510;
double r22514 = r22510 * r22492;
double r22515 = r22513 * r22514;
double r22516 = exp(r22515);
double r22517 = r22509 / r22516;
double r22518 = r22508 * r22517;
double r22519 = r22502 ? r22500 : r22518;
return r22519;
}



Bits error versus x.re



Bits error versus x.im



Bits error versus y.re



Bits error versus y.im
if (* (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)))) < 0.999999999986341Initial program 4.4
if 0.999999999986341 < (* (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)))) Initial program 47.1
Simplified6.4
rmApplied add-cube-cbrt6.4
Applied associate-*l*6.4
rmApplied expm1-log1p-u6.4
rmApplied add-log-exp6.6
Final simplification5.9
herbie shell --seed 2019304 +o rules:numerics
(FPCore (x.re x.im y.re y.im)
:name "powComplex, real part"
:precision binary64
(* (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)))))