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.4891181159633834 \cdot 10^{+116}:\\
\;\;\;\;\frac{\sqrt{2.0} \cdot \left|im\right|}{\sqrt{-2 \cdot re}} \cdot 0.5\\
\mathbf{elif}\;re \le 1.3001999503965804 \cdot 10^{-165}:\\
\;\;\;\;0.5 \cdot \frac{\left|im\right|}{\frac{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}}{\sqrt{2.0}}}\\
\mathbf{elif}\;re \le 8235632211164311.0:\\
\;\;\;\;0.5 \cdot e^{\log \left(\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + re\right) \cdot 2.0}\\
\end{array}double f(double re, double im) {
double r7053559 = 0.5;
double r7053560 = 2.0;
double r7053561 = re;
double r7053562 = r7053561 * r7053561;
double r7053563 = im;
double r7053564 = r7053563 * r7053563;
double r7053565 = r7053562 + r7053564;
double r7053566 = sqrt(r7053565);
double r7053567 = r7053566 + r7053561;
double r7053568 = r7053560 * r7053567;
double r7053569 = sqrt(r7053568);
double r7053570 = r7053559 * r7053569;
return r7053570;
}
double f(double re, double im) {
double r7053571 = re;
double r7053572 = -1.4891181159633834e+116;
bool r7053573 = r7053571 <= r7053572;
double r7053574 = 2.0;
double r7053575 = sqrt(r7053574);
double r7053576 = im;
double r7053577 = fabs(r7053576);
double r7053578 = r7053575 * r7053577;
double r7053579 = -2.0;
double r7053580 = r7053579 * r7053571;
double r7053581 = sqrt(r7053580);
double r7053582 = r7053578 / r7053581;
double r7053583 = 0.5;
double r7053584 = r7053582 * r7053583;
double r7053585 = 1.3001999503965804e-165;
bool r7053586 = r7053571 <= r7053585;
double r7053587 = r7053576 * r7053576;
double r7053588 = r7053571 * r7053571;
double r7053589 = r7053587 + r7053588;
double r7053590 = sqrt(r7053589);
double r7053591 = r7053590 - r7053571;
double r7053592 = sqrt(r7053591);
double r7053593 = r7053592 / r7053575;
double r7053594 = r7053577 / r7053593;
double r7053595 = r7053583 * r7053594;
double r7053596 = 8235632211164311.0;
bool r7053597 = r7053571 <= r7053596;
double r7053598 = r7053571 + r7053590;
double r7053599 = r7053598 * r7053574;
double r7053600 = sqrt(r7053599);
double r7053601 = log(r7053600);
double r7053602 = exp(r7053601);
double r7053603 = r7053583 * r7053602;
double r7053604 = r7053571 + r7053571;
double r7053605 = r7053604 * r7053574;
double r7053606 = sqrt(r7053605);
double r7053607 = r7053583 * r7053606;
double r7053608 = r7053597 ? r7053603 : r7053607;
double r7053609 = r7053586 ? r7053595 : r7053608;
double r7053610 = r7053573 ? r7053584 : r7053609;
return r7053610;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.2 |
|---|---|
| Target | 32.2 |
| Herbie | 18.3 |
if re < -1.4891181159633834e+116Initial program 60.7
rmApplied flip-+60.7
Applied associate-*r/60.7
Applied sqrt-div60.7
Simplified44.9
rmApplied *-un-lft-identity44.9
Applied sqrt-prod44.9
Applied sqrt-prod44.9
Applied times-frac44.9
Simplified43.2
rmApplied associate-*r/43.1
Taylor expanded around -inf 9.2
if -1.4891181159633834e+116 < re < 1.3001999503965804e-165Initial program 35.7
rmApplied flip-+36.1
Applied associate-*r/36.1
Applied sqrt-div36.3
Simplified29.7
rmApplied *-un-lft-identity29.7
Applied sqrt-prod29.7
Applied sqrt-prod29.7
Applied times-frac29.8
Simplified23.0
rmApplied associate-*r/23.0
rmApplied associate-/l*23.1
if 1.3001999503965804e-165 < re < 8235632211164311.0Initial program 15.4
rmApplied add-exp-log18.0
if 8235632211164311.0 < re Initial program 39.1
Taylor expanded around inf 14.7
Final simplification18.3
herbie shell --seed 2019158
(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)))))