0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -2.5723644386022114 \cdot 10^{-302}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}}\\
\mathbf{elif}\;re \le 2.73482328897160755 \cdot 10^{-169}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \le 5.11600267670621171 \cdot 10^{-144}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re + \sqrt{im \cdot im + re \cdot re}} \cdot \sqrt{re + \sqrt{im \cdot im + re \cdot re}}\right)}\\
\mathbf{elif}\;re \le 4.73579724108509554 \cdot 10^{-105}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \le 9.20722563241957548 \cdot 10^{119}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \sqrt{im \cdot im + re \cdot re}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double code(double re, double im) {
return ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (((double) sqrt(((double) (((double) (re * re)) + ((double) (im * im)))))) + re))))))));
}
double code(double re, double im) {
double VAR;
if ((re <= -2.5723644386022114e-302)) {
VAR = ((double) (0.5 * ((double) (((double) sqrt(((double) (((double) (im * im)) * 2.0)))) / ((double) sqrt(((double) (((double) sqrt(((double) (((double) (im * im)) + ((double) (re * re)))))) - re))))))));
} else {
double VAR_1;
if ((re <= 2.7348232889716076e-169)) {
VAR_1 = ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (re + im))))))));
} else {
double VAR_2;
if ((re <= 5.1160026767062117e-144)) {
VAR_2 = ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (((double) sqrt(((double) (re + ((double) sqrt(((double) (((double) (im * im)) + ((double) (re * re)))))))))) * ((double) sqrt(((double) (re + ((double) sqrt(((double) (((double) (im * im)) + ((double) (re * re))))))))))))))))));
} else {
double VAR_3;
if ((re <= 4.7357972410850955e-105)) {
VAR_3 = ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (re + im))))))));
} else {
double VAR_4;
if ((re <= 9.207225632419575e+119)) {
VAR_4 = ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (re + ((double) sqrt(((double) (((double) (im * im)) + ((double) (re * re))))))))))))));
} else {
VAR_4 = ((double) (0.5 * ((double) sqrt(((double) (2.0 * ((double) (re + re))))))));
}
VAR_3 = VAR_4;
}
VAR_2 = VAR_3;
}
VAR_1 = VAR_2;
}
VAR = VAR_1;
}
return VAR;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.2 |
|---|---|
| Target | 33.3 |
| Herbie | 27.1 |
if re < -2.5723644386022114e-302Initial program 45.3
rmApplied flip-+45.2
Applied associate-*r/45.2
Applied sqrt-div45.3
Simplified34.5
if -2.5723644386022114e-302 < re < 2.73482328897160755e-169 or 5.11600267670621171e-144 < re < 4.73579724108509554e-105Initial program 26.1
Taylor expanded around 0 35.2
if 2.73482328897160755e-169 < re < 5.11600267670621171e-144Initial program 20.3
rmApplied add-sqr-sqrt20.5
Simplified20.5
Simplified20.5
if 4.73579724108509554e-105 < re < 9.20722563241957548e119Initial program 15.6
if 9.20722563241957548e119 < re Initial program 55.2
Taylor expanded around inf 10.2
Final simplification27.1
herbie shell --seed 2020181
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
: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)))))