0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -8.6798958381282374 \cdot 10^{-307}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 2.5975290754985087 \cdot 10^{85}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(\sqrt{\left|\sqrt[3]{re \cdot re + im \cdot im}\right|} \cdot \sqrt{\sqrt[3]{\sqrt{re \cdot re + im \cdot im}}}\right) \cdot \left(\sqrt{\left|\sqrt[3]{re \cdot re + im \cdot im}\right|} \cdot \sqrt{\sqrt[3]{\sqrt{re \cdot re + im \cdot im}}}\right) + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r175449 = 0.5;
double r175450 = 2.0;
double r175451 = re;
double r175452 = r175451 * r175451;
double r175453 = im;
double r175454 = r175453 * r175453;
double r175455 = r175452 + r175454;
double r175456 = sqrt(r175455);
double r175457 = r175456 + r175451;
double r175458 = r175450 * r175457;
double r175459 = sqrt(r175458);
double r175460 = r175449 * r175459;
return r175460;
}
double f(double re, double im) {
double r175461 = re;
double r175462 = -8.679895838128237e-307;
bool r175463 = r175461 <= r175462;
double r175464 = 0.5;
double r175465 = 2.0;
double r175466 = im;
double r175467 = r175466 * r175466;
double r175468 = r175461 * r175461;
double r175469 = r175468 + r175467;
double r175470 = sqrt(r175469);
double r175471 = r175470 - r175461;
double r175472 = r175467 / r175471;
double r175473 = r175465 * r175472;
double r175474 = sqrt(r175473);
double r175475 = r175464 * r175474;
double r175476 = 2.5975290754985087e+85;
bool r175477 = r175461 <= r175476;
double r175478 = cbrt(r175469);
double r175479 = fabs(r175478);
double r175480 = sqrt(r175479);
double r175481 = cbrt(r175470);
double r175482 = sqrt(r175481);
double r175483 = r175480 * r175482;
double r175484 = r175483 * r175483;
double r175485 = r175484 + r175461;
double r175486 = r175465 * r175485;
double r175487 = sqrt(r175486);
double r175488 = r175464 * r175487;
double r175489 = 2.0;
double r175490 = r175489 * r175461;
double r175491 = r175465 * r175490;
double r175492 = sqrt(r175491);
double r175493 = r175464 * r175492;
double r175494 = r175477 ? r175488 : r175493;
double r175495 = r175463 ? r175475 : r175494;
return r175495;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 26.8 |
if re < -8.679895838128237e-307Initial program 45.7
rmApplied flip-+45.6
Simplified35.8
if -8.679895838128237e-307 < re < 2.5975290754985087e+85Initial program 21.0
rmApplied add-cube-cbrt21.2
Applied sqrt-prod21.2
Simplified21.2
rmApplied add-sqr-sqrt21.2
Applied cbrt-prod21.2
Applied sqrt-prod21.3
Applied add-sqr-sqrt21.3
Applied unswap-sqr21.3
if 2.5975290754985087e+85 < re Initial program 50.0
Taylor expanded around inf 10.9
Final simplification26.8
herbie shell --seed 2020027
(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)))))