0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \le -3.427084990917964108413212422566201425884 \cdot 10^{78}:\\
\;\;\;\;\sqrt{\left(re - im\right) \cdot 2} \cdot 0.5\\
\mathbf{elif}\;im \le -6.880635684369791890266505163497341664663 \cdot 10^{-159}:\\
\;\;\;\;\sqrt{2 \cdot \left(\sqrt[3]{\sqrt{re \cdot re + im \cdot im}} \cdot \left(\sqrt[3]{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt[3]{\sqrt{re \cdot re + im \cdot im}}\right) + re\right)} \cdot 0.5\\
\mathbf{elif}\;im \le 9.707826590282529498928144182059884326441 \cdot 10^{-159}:\\
\;\;\;\;\sqrt{2 \cdot \left(re \cdot 2\right)} \cdot 0.5\\
\mathbf{elif}\;im \le 1.186844868934467533231645340789520602325 \cdot 10^{-110}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}} \cdot 0.5\\
\mathbf{elif}\;im \le 8.35344993113947417274173199718646800664 \cdot 10^{-93}:\\
\;\;\;\;\sqrt{2 \cdot \left(re \cdot 2\right)} \cdot 0.5\\
\mathbf{elif}\;im \le 9.216308869239449327917900245724612540155 \cdot 10^{-10}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{2 \cdot \left(re + im\right)} \cdot 0.5\\
\end{array}double f(double re, double im) {
double r83427 = 0.5;
double r83428 = 2.0;
double r83429 = re;
double r83430 = r83429 * r83429;
double r83431 = im;
double r83432 = r83431 * r83431;
double r83433 = r83430 + r83432;
double r83434 = sqrt(r83433);
double r83435 = r83434 + r83429;
double r83436 = r83428 * r83435;
double r83437 = sqrt(r83436);
double r83438 = r83427 * r83437;
return r83438;
}
double f(double re, double im) {
double r83439 = im;
double r83440 = -3.427084990917964e+78;
bool r83441 = r83439 <= r83440;
double r83442 = re;
double r83443 = r83442 - r83439;
double r83444 = 2.0;
double r83445 = r83443 * r83444;
double r83446 = sqrt(r83445);
double r83447 = 0.5;
double r83448 = r83446 * r83447;
double r83449 = -6.880635684369792e-159;
bool r83450 = r83439 <= r83449;
double r83451 = r83442 * r83442;
double r83452 = r83439 * r83439;
double r83453 = r83451 + r83452;
double r83454 = sqrt(r83453);
double r83455 = cbrt(r83454);
double r83456 = r83455 * r83455;
double r83457 = r83455 * r83456;
double r83458 = r83457 + r83442;
double r83459 = r83444 * r83458;
double r83460 = sqrt(r83459);
double r83461 = r83460 * r83447;
double r83462 = 9.70782659028253e-159;
bool r83463 = r83439 <= r83462;
double r83464 = 2.0;
double r83465 = r83442 * r83464;
double r83466 = r83444 * r83465;
double r83467 = sqrt(r83466);
double r83468 = r83467 * r83447;
double r83469 = 1.1868448689344675e-110;
bool r83470 = r83439 <= r83469;
double r83471 = r83452 * r83444;
double r83472 = sqrt(r83471);
double r83473 = r83454 - r83442;
double r83474 = sqrt(r83473);
double r83475 = r83472 / r83474;
double r83476 = r83475 * r83447;
double r83477 = 8.353449931139474e-93;
bool r83478 = r83439 <= r83477;
double r83479 = 9.216308869239449e-10;
bool r83480 = r83439 <= r83479;
double r83481 = r83452 / r83473;
double r83482 = r83444 * r83481;
double r83483 = sqrt(r83482);
double r83484 = r83447 * r83483;
double r83485 = r83442 + r83439;
double r83486 = r83444 * r83485;
double r83487 = sqrt(r83486);
double r83488 = r83487 * r83447;
double r83489 = r83480 ? r83484 : r83488;
double r83490 = r83478 ? r83468 : r83489;
double r83491 = r83470 ? r83476 : r83490;
double r83492 = r83463 ? r83468 : r83491;
double r83493 = r83450 ? r83461 : r83492;
double r83494 = r83441 ? r83448 : r83493;
return r83494;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.6 |
|---|---|
| Target | 32.7 |
| Herbie | 22.6 |
if im < -3.427084990917964e+78Initial program 47.4
rmApplied add-cube-cbrt47.6
Simplified47.6
Simplified47.6
Taylor expanded around -inf 11.2
if -3.427084990917964e+78 < im < -6.880635684369792e-159Initial program 25.2
rmApplied add-cube-cbrt25.7
Simplified25.7
Simplified25.7
if -6.880635684369792e-159 < im < 9.70782659028253e-159 or 1.1868448689344675e-110 < im < 8.353449931139474e-93Initial program 42.3
Taylor expanded around inf 34.8
if 9.70782659028253e-159 < im < 1.1868448689344675e-110Initial program 29.1
rmApplied flip-+43.5
Applied associate-*r/43.5
Applied sqrt-div43.6
Simplified29.6
Simplified29.6
if 8.353449931139474e-93 < im < 9.216308869239449e-10Initial program 24.0
rmApplied flip-+35.4
Simplified25.1
Simplified25.1
if 9.216308869239449e-10 < im Initial program 39.8
rmApplied add-cube-cbrt40.0
Simplified40.0
Simplified40.0
Taylor expanded around inf 15.0
Simplified15.0
Final simplification22.6
herbie shell --seed 2019194
(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)))))