double f(double re, double im) {
double r1134618 = 0.5;
double r1134619 = 2.0;
double r1134620 = re;
double r1134621 = r1134620 * r1134620;
double r1134622 = im;
double r1134623 = r1134622 * r1134622;
double r1134624 = r1134621 + r1134623;
double r1134625 = sqrt(r1134624);
double r1134626 = r1134625 - r1134620;
double r1134627 = r1134619 * r1134626;
double r1134628 = sqrt(r1134627);
double r1134629 = r1134618 * r1134628;
return r1134629;
}
double f(double re, double im) {
double r1134630 = re;
double r1134631 = -0.0087738037109375;
bool r1134632 = r1134630 <= r1134631;
double r1134633 = 0.5;
double r1134634 = 2.0;
double r1134635 = r1134630 * r1134630;
double r1134636 = im;
double r1134637 = r1134636 * r1134636;
double r1134638 = r1134635 + r1134637;
double r1134639 = sqrt(r1134638);
double r1134640 = r1134639 - r1134630;
double r1134641 = r1134634 * r1134640;
double r1134642 = sqrt(r1134641);
double r1134643 = r1134633 * r1134642;
double r1134644 = r1134637 + r1134635;
double r1134645 = sqrt(r1134644);
double r1134646 = r1134645 + r1134630;
double r1134647 = r1134634 / r1134646;
double r1134648 = 1.0;
double r1134649 = r1134648 * r1134637;
double r1134650 = r1134647 * r1134649;
double r1134651 = sqrt(r1134650);
double r1134652 = r1134651 * r1134633;
double r1134653 = r1134632 ? r1134643 : r1134652;
return r1134653;
}
0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le -0.0087738037109375:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\frac{2.0}{\sqrt{im \cdot im + re \cdot re} + re} \cdot \left(1.0 \cdot \left(im \cdot im\right)\right)} \cdot 0.5\\
\end{array}


Bits error versus re



Bits error versus im
if re < -0.0087738037109375Initial program 0.7
if -0.0087738037109375 < re Initial program 3.2
rmApplied p16-flip--3.0
rmApplied difference-of-squares3.2
rmApplied p16-flip--3.0
Applied associate-*r/3.6
Applied associate-/l/3.6
Simplified1.7
Simplified0.8
Final simplification0.8
herbie shell --seed 2019102 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, imaginary part, im greater than 0 branch"
(*.p16 (real->posit16 0.5) (sqrt.p16 (*.p16 (real->posit16 2.0) (-.p16 (sqrt.p16 (+.p16 (*.p16 re re) (*.p16 im im))) re)))))