0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.5342940406584555 \cdot 10^{+139}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2.0}}{\sqrt{-2 \cdot re}} \cdot 0.5\\
\mathbf{elif}\;re \le -1.2687134238210794 \cdot 10^{-274}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\frac{\sqrt[3]{im} \cdot \sqrt[3]{im}}{\sqrt[3]{\frac{\sqrt{re \cdot re + im \cdot im} - re}{2.0 \cdot im}} \cdot \sqrt[3]{\frac{\sqrt{re \cdot re + im \cdot im} - re}{2.0 \cdot im}}}} \cdot \sqrt{\frac{\sqrt[3]{im}}{\sqrt[3]{\frac{\sqrt{re \cdot re + im \cdot im} - re}{2.0 \cdot im}}}}\right)\\
\mathbf{elif}\;re \le 1.065532004127847 \cdot 10^{+150}:\\
\;\;\;\;\sqrt{\left(\sqrt{re \cdot re + im \cdot im} + re\right) \cdot 2.0} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{re \cdot 4.0}\\
\end{array}double f(double re, double im) {
double r1922617 = 0.5;
double r1922618 = 2.0;
double r1922619 = re;
double r1922620 = r1922619 * r1922619;
double r1922621 = im;
double r1922622 = r1922621 * r1922621;
double r1922623 = r1922620 + r1922622;
double r1922624 = sqrt(r1922623);
double r1922625 = r1922624 + r1922619;
double r1922626 = r1922618 * r1922625;
double r1922627 = sqrt(r1922626);
double r1922628 = r1922617 * r1922627;
return r1922628;
}
double f(double re, double im) {
double r1922629 = re;
double r1922630 = -1.5342940406584555e+139;
bool r1922631 = r1922629 <= r1922630;
double r1922632 = im;
double r1922633 = r1922632 * r1922632;
double r1922634 = 2.0;
double r1922635 = r1922633 * r1922634;
double r1922636 = sqrt(r1922635);
double r1922637 = -2.0;
double r1922638 = r1922637 * r1922629;
double r1922639 = sqrt(r1922638);
double r1922640 = r1922636 / r1922639;
double r1922641 = 0.5;
double r1922642 = r1922640 * r1922641;
double r1922643 = -1.2687134238210794e-274;
bool r1922644 = r1922629 <= r1922643;
double r1922645 = cbrt(r1922632);
double r1922646 = r1922645 * r1922645;
double r1922647 = r1922629 * r1922629;
double r1922648 = r1922647 + r1922633;
double r1922649 = sqrt(r1922648);
double r1922650 = r1922649 - r1922629;
double r1922651 = r1922634 * r1922632;
double r1922652 = r1922650 / r1922651;
double r1922653 = cbrt(r1922652);
double r1922654 = r1922653 * r1922653;
double r1922655 = r1922646 / r1922654;
double r1922656 = sqrt(r1922655);
double r1922657 = r1922645 / r1922653;
double r1922658 = sqrt(r1922657);
double r1922659 = r1922656 * r1922658;
double r1922660 = r1922641 * r1922659;
double r1922661 = 1.065532004127847e+150;
bool r1922662 = r1922629 <= r1922661;
double r1922663 = r1922649 + r1922629;
double r1922664 = r1922663 * r1922634;
double r1922665 = sqrt(r1922664);
double r1922666 = r1922665 * r1922641;
double r1922667 = 4.0;
double r1922668 = r1922629 * r1922667;
double r1922669 = sqrt(r1922668);
double r1922670 = r1922641 * r1922669;
double r1922671 = r1922662 ? r1922666 : r1922670;
double r1922672 = r1922644 ? r1922660 : r1922671;
double r1922673 = r1922631 ? r1922642 : r1922672;
return r1922673;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.1 |
|---|---|
| Target | 33.0 |
| Herbie | 20.0 |
if re < -1.5342940406584555e+139Initial program 61.4
rmApplied flip-+61.4
Applied associate-*r/61.4
Applied sqrt-div61.4
Simplified46.4
Taylor expanded around -inf 18.6
if -1.5342940406584555e+139 < re < -1.2687134238210794e-274Initial program 40.0
rmApplied flip-+39.9
Applied associate-*r/40.0
Applied sqrt-div40.1
Simplified29.7
rmApplied sqrt-undiv30.7
Simplified30.7
rmApplied associate-/l*29.0
rmApplied add-cube-cbrt29.4
Applied add-cube-cbrt29.5
Applied times-frac29.5
Applied sqrt-prod23.9
if -1.2687134238210794e-274 < re < 1.065532004127847e+150Initial program 20.8
if 1.065532004127847e+150 < re Initial program 60.4
rmApplied flip-+61.3
Applied associate-*r/61.3
Applied sqrt-div61.3
Simplified62.1
rmApplied sqrt-undiv62.1
Simplified62.1
rmApplied associate-/l*62.5
Taylor expanded around 0 8.6
Final simplification20.0
herbie shell --seed 2019141
(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)))))