0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.258700308413734263198473092360990096615 \cdot 10^{-288}:\\
\;\;\;\;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 1.015933577747527344666564222799068286537 \cdot 10^{138}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\left|\sqrt[3]{re \cdot re + im \cdot im}\right|}\right) \cdot \sqrt{\sqrt{\sqrt[3]{re \cdot re + im \cdot im}}} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r98106 = 0.5;
double r98107 = 2.0;
double r98108 = re;
double r98109 = r98108 * r98108;
double r98110 = im;
double r98111 = r98110 * r98110;
double r98112 = r98109 + r98111;
double r98113 = sqrt(r98112);
double r98114 = r98113 + r98108;
double r98115 = r98107 * r98114;
double r98116 = sqrt(r98115);
double r98117 = r98106 * r98116;
return r98117;
}
double f(double re, double im) {
double r98118 = re;
double r98119 = -3.2587003084137343e-288;
bool r98120 = r98118 <= r98119;
double r98121 = 0.5;
double r98122 = im;
double r98123 = r98122 * r98122;
double r98124 = 2.0;
double r98125 = r98123 * r98124;
double r98126 = sqrt(r98125);
double r98127 = r98118 * r98118;
double r98128 = r98127 + r98123;
double r98129 = sqrt(r98128);
double r98130 = r98129 - r98118;
double r98131 = sqrt(r98130);
double r98132 = r98126 / r98131;
double r98133 = r98121 * r98132;
double r98134 = 1.0159335777475273e+138;
bool r98135 = r98118 <= r98134;
double r98136 = sqrt(r98129);
double r98137 = cbrt(r98128);
double r98138 = fabs(r98137);
double r98139 = sqrt(r98138);
double r98140 = r98136 * r98139;
double r98141 = sqrt(r98137);
double r98142 = sqrt(r98141);
double r98143 = r98140 * r98142;
double r98144 = r98143 + r98118;
double r98145 = r98124 * r98144;
double r98146 = sqrt(r98145);
double r98147 = r98121 * r98146;
double r98148 = r98118 + r98118;
double r98149 = r98124 * r98148;
double r98150 = sqrt(r98149);
double r98151 = r98121 * r98150;
double r98152 = r98135 ? r98147 : r98151;
double r98153 = r98120 ? r98133 : r98152;
return r98153;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 26.4 |
if re < -3.2587003084137343e-288Initial program 46.5
rmApplied flip-+46.4
Applied associate-*r/46.4
Applied sqrt-div46.5
Simplified35.4
if -3.2587003084137343e-288 < re < 1.0159335777475273e+138Initial program 20.9
rmApplied add-sqr-sqrt20.9
Applied sqrt-prod21.0
rmApplied add-cube-cbrt21.0
Applied sqrt-prod21.0
Applied sqrt-prod21.1
Applied associate-*r*21.0
Simplified21.0
if 1.0159335777475273e+138 < re Initial program 58.8
Taylor expanded around inf 9.0
Final simplification26.4
herbie shell --seed 2019323
(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)))))