0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\
\mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r331487 = 0.5;
double r331488 = 2.0;
double r331489 = re;
double r331490 = r331489 * r331489;
double r331491 = im;
double r331492 = r331491 * r331491;
double r331493 = r331490 + r331492;
double r331494 = sqrt(r331493);
double r331495 = r331494 + r331489;
double r331496 = r331488 * r331495;
double r331497 = sqrt(r331496);
double r331498 = r331487 * r331497;
return r331498;
}
double f(double re, double im) {
double r331499 = re;
double r331500 = -8.500232528907394e-258;
bool r331501 = r331499 <= r331500;
double r331502 = 0.5;
double r331503 = 2.0;
double r331504 = im;
double r331505 = 2.0;
double r331506 = pow(r331504, r331505);
double r331507 = r331499 * r331499;
double r331508 = r331504 * r331504;
double r331509 = r331507 + r331508;
double r331510 = sqrt(r331509);
double r331511 = r331510 - r331499;
double r331512 = r331506 / r331511;
double r331513 = r331503 * r331512;
double r331514 = sqrt(r331513);
double r331515 = r331502 * r331514;
double r331516 = 3.6148118604621735e-246;
bool r331517 = r331499 <= r331516;
double r331518 = r331504 + r331499;
double r331519 = r331503 * r331518;
double r331520 = sqrt(r331519);
double r331521 = r331502 * r331520;
double r331522 = 8.439330033545885e+67;
bool r331523 = r331499 <= r331522;
double r331524 = r331510 + r331499;
double r331525 = r331503 * r331524;
double r331526 = sqrt(r331525);
double r331527 = r331502 * r331526;
double r331528 = r331505 * r331499;
double r331529 = r331503 * r331528;
double r331530 = sqrt(r331529);
double r331531 = r331502 * r331530;
double r331532 = r331523 ? r331527 : r331531;
double r331533 = r331517 ? r331521 : r331532;
double r331534 = r331501 ? r331515 : r331533;
return r331534;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.3 |
|---|---|
| Target | 33.4 |
| Herbie | 26.7 |
if re < -8.500232528907394e-258Initial program 46.6
rmApplied flip-+46.5
Simplified35.9
if -8.500232528907394e-258 < re < 3.6148118604621735e-246Initial program 30.4
rmApplied add-exp-log32.5
rmApplied pow1/232.5
Applied log-pow32.5
Applied exp-prod32.8
Taylor expanded around 0 32.3
if 3.6148118604621735e-246 < re < 8.439330033545885e+67Initial program 19.4
if 8.439330033545885e+67 < re Initial program 46.7
rmApplied add-exp-log47.8
rmApplied pow1/247.8
Applied log-pow47.8
Applied exp-prod47.9
Taylor expanded around inf 12.0
Final simplification26.7
herbie shell --seed 2020001
(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)))))