0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -6.372928415220732 \cdot 10^{+77}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2.0}}{\sqrt{-2 \cdot re}} \cdot 0.5\\
\mathbf{elif}\;re \le -250805254296428.34:\\
\;\;\;\;\frac{\sqrt{2.0} \cdot \left(-im\right)}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}} \cdot 0.5\\
\mathbf{elif}\;re \le 5.6246880270826 \cdot 10^{+124}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + \sqrt{re \cdot re + im \cdot im}\right) \cdot 2.0}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{re \cdot 4.0}\\
\end{array}double f(double re, double im) {
double r51629672 = 0.5;
double r51629673 = 2.0;
double r51629674 = re;
double r51629675 = r51629674 * r51629674;
double r51629676 = im;
double r51629677 = r51629676 * r51629676;
double r51629678 = r51629675 + r51629677;
double r51629679 = sqrt(r51629678);
double r51629680 = r51629679 + r51629674;
double r51629681 = r51629673 * r51629680;
double r51629682 = sqrt(r51629681);
double r51629683 = r51629672 * r51629682;
return r51629683;
}
double f(double re, double im) {
double r51629684 = re;
double r51629685 = -6.372928415220732e+77;
bool r51629686 = r51629684 <= r51629685;
double r51629687 = im;
double r51629688 = r51629687 * r51629687;
double r51629689 = 2.0;
double r51629690 = r51629688 * r51629689;
double r51629691 = sqrt(r51629690);
double r51629692 = -2.0;
double r51629693 = r51629692 * r51629684;
double r51629694 = sqrt(r51629693);
double r51629695 = r51629691 / r51629694;
double r51629696 = 0.5;
double r51629697 = r51629695 * r51629696;
double r51629698 = -250805254296428.34;
bool r51629699 = r51629684 <= r51629698;
double r51629700 = sqrt(r51629689);
double r51629701 = -r51629687;
double r51629702 = r51629700 * r51629701;
double r51629703 = r51629684 * r51629684;
double r51629704 = r51629703 + r51629688;
double r51629705 = sqrt(r51629704);
double r51629706 = r51629705 - r51629684;
double r51629707 = sqrt(r51629706);
double r51629708 = r51629702 / r51629707;
double r51629709 = r51629708 * r51629696;
double r51629710 = 5.6246880270826e+124;
bool r51629711 = r51629684 <= r51629710;
double r51629712 = r51629684 + r51629705;
double r51629713 = r51629712 * r51629689;
double r51629714 = sqrt(r51629713);
double r51629715 = r51629696 * r51629714;
double r51629716 = 4.0;
double r51629717 = r51629684 * r51629716;
double r51629718 = sqrt(r51629717);
double r51629719 = r51629696 * r51629718;
double r51629720 = r51629711 ? r51629715 : r51629719;
double r51629721 = r51629699 ? r51629709 : r51629720;
double r51629722 = r51629686 ? r51629697 : r51629721;
return r51629722;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.1 |
|---|---|
| Target | 32.5 |
| Herbie | 23.2 |
if re < -6.372928415220732e+77Initial program 58.7
rmApplied flip-+58.7
Applied associate-*r/58.7
Applied sqrt-div58.7
Simplified42.2
Taylor expanded around -inf 23.3
if -6.372928415220732e+77 < re < -250805254296428.34Initial program 46.9
rmApplied flip-+46.9
Applied associate-*r/46.9
Applied sqrt-div47.0
Simplified29.2
Taylor expanded around -inf 36.4
Simplified36.4
if -250805254296428.34 < re < 5.6246880270826e+124Initial program 25.6
rmApplied *-un-lft-identity25.6
if 5.6246880270826e+124 < re Initial program 54.5
rmApplied flip-+61.2
Applied associate-*r/61.2
Applied sqrt-div61.2
Simplified61.9
rmApplied sqrt-undiv61.9
Taylor expanded around 0 8.2
Final simplification23.2
herbie shell --seed 2019119
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))