0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le 4.003218908727751769435456693065969257664 \cdot 10^{-310}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 8.148041992667695284543397003902154699559 \cdot 10^{135}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im}}} \cdot {\left(\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im}}}\right)}^{3} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r103754 = 0.5;
double r103755 = 2.0;
double r103756 = re;
double r103757 = r103756 * r103756;
double r103758 = im;
double r103759 = r103758 * r103758;
double r103760 = r103757 + r103759;
double r103761 = sqrt(r103760);
double r103762 = r103761 + r103756;
double r103763 = r103755 * r103762;
double r103764 = sqrt(r103763);
double r103765 = r103754 * r103764;
return r103765;
}
double f(double re, double im) {
double r103766 = re;
double r103767 = 4.00321890872775e-310;
bool r103768 = r103766 <= r103767;
double r103769 = 0.5;
double r103770 = im;
double r103771 = r103770 * r103770;
double r103772 = 2.0;
double r103773 = r103771 * r103772;
double r103774 = sqrt(r103773);
double r103775 = r103766 * r103766;
double r103776 = r103775 + r103771;
double r103777 = sqrt(r103776);
double r103778 = r103777 - r103766;
double r103779 = sqrt(r103778);
double r103780 = r103774 / r103779;
double r103781 = r103769 * r103780;
double r103782 = 8.148041992667695e+135;
bool r103783 = r103766 <= r103782;
double r103784 = sqrt(r103777);
double r103785 = sqrt(r103784);
double r103786 = 3.0;
double r103787 = pow(r103785, r103786);
double r103788 = r103785 * r103787;
double r103789 = r103788 + r103766;
double r103790 = r103772 * r103789;
double r103791 = sqrt(r103790);
double r103792 = r103769 * r103791;
double r103793 = 2.0;
double r103794 = r103793 * r103766;
double r103795 = r103772 * r103794;
double r103796 = sqrt(r103795);
double r103797 = r103769 * r103796;
double r103798 = r103783 ? r103792 : r103797;
double r103799 = r103768 ? r103781 : r103798;
return r103799;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 33.7 |
| Herbie | 26.5 |
if re < 4.00321890872775e-310Initial program 46.3
rmApplied flip-+46.2
Applied associate-*r/46.2
Applied sqrt-div46.2
Simplified35.1
if 4.00321890872775e-310 < re < 8.148041992667695e+135Initial program 21.0
rmApplied add-sqr-sqrt21.0
Applied sqrt-prod21.1
rmApplied add-sqr-sqrt21.1
Applied sqrt-prod21.1
Applied sqrt-prod21.2
Applied associate-*l*21.2
Simplified21.3
if 8.148041992667695e+135 < re Initial program 58.0
rmApplied add-sqr-sqrt58.0
Applied sqrt-prod58.0
rmApplied add-sqr-sqrt58.0
Applied sqrt-prod58.0
Applied sqrt-prod58.0
Applied associate-*l*58.0
Simplified58.0
Taylor expanded around inf 8.4
Final simplification26.5
herbie shell --seed 2019303
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))