0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le 6.0730335609358128 \cdot 10^{-309}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 4.871932821462343 \cdot 10^{87}:\\
\;\;\;\;0.5 \cdot \sqrt{\left({\left(\sqrt{re \cdot re + im \cdot im}\right)}^{\frac{3}{8}} \cdot \left(\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im}}} \cdot {\left(\sqrt{re \cdot re + im \cdot im}\right)}^{\frac{3}{8}}\right) + re\right) \cdot 2}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r116528 = 0.5;
double r116529 = 2.0;
double r116530 = re;
double r116531 = r116530 * r116530;
double r116532 = im;
double r116533 = r116532 * r116532;
double r116534 = r116531 + r116533;
double r116535 = sqrt(r116534);
double r116536 = r116535 + r116530;
double r116537 = r116529 * r116536;
double r116538 = sqrt(r116537);
double r116539 = r116528 * r116538;
return r116539;
}
double f(double re, double im) {
double r116540 = re;
double r116541 = 6.073033560935813e-309;
bool r116542 = r116540 <= r116541;
double r116543 = 0.5;
double r116544 = 2.0;
double r116545 = im;
double r116546 = r116545 * r116545;
double r116547 = r116544 * r116546;
double r116548 = sqrt(r116547);
double r116549 = r116540 * r116540;
double r116550 = r116549 + r116546;
double r116551 = sqrt(r116550);
double r116552 = r116551 - r116540;
double r116553 = sqrt(r116552);
double r116554 = r116548 / r116553;
double r116555 = r116543 * r116554;
double r116556 = 4.871932821462343e+87;
bool r116557 = r116540 <= r116556;
double r116558 = 0.375;
double r116559 = pow(r116551, r116558);
double r116560 = sqrt(r116551);
double r116561 = sqrt(r116560);
double r116562 = r116561 * r116559;
double r116563 = r116559 * r116562;
double r116564 = r116563 + r116540;
double r116565 = r116564 * r116544;
double r116566 = sqrt(r116565);
double r116567 = r116543 * r116566;
double r116568 = r116540 + r116540;
double r116569 = r116544 * r116568;
double r116570 = sqrt(r116569);
double r116571 = r116543 * r116570;
double r116572 = r116557 ? r116567 : r116571;
double r116573 = r116542 ? r116555 : r116572;
return r116573;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.6 |
| Herbie | 26.4 |
if re < 6.073033560935813e-309Initial program 45.6
rmApplied flip-+45.5
Applied associate-*r/45.5
Applied sqrt-div45.6
Simplified34.7
if 6.073033560935813e-309 < re < 4.871932821462343e+87Initial program 21.0
rmApplied add-sqr-sqrt21.0
Applied sqrt-prod21.1
rmApplied add-sqr-sqrt21.1
Applied sqrt-prod21.1
Applied sqrt-prod21.1
Applied associate-*l*21.1
Simplified21.2
rmApplied pow1/221.2
Applied sqrt-pow121.2
Applied pow-pow21.0
Simplified21.0
rmApplied sqr-pow21.1
Applied associate-*r*21.1
Simplified21.1
if 4.871932821462343e+87 < re Initial program 50.3
Taylor expanded around inf 11.3
Final simplification26.4
herbie shell --seed 2019195
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (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)))))