0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -5.8408794472488761 \cdot 10^{164}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{-2 \cdot re}}\\
\mathbf{elif}\;re \le 9.76899627496736849 \cdot 10^{-287}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \left|\frac{im}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\right|\right)\\
\mathbf{elif}\;re \le 1.9399661775247916 \cdot 10^{118}:\\
\;\;\;\;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 r295206 = 0.5;
double r295207 = 2.0;
double r295208 = re;
double r295209 = r295208 * r295208;
double r295210 = im;
double r295211 = r295210 * r295210;
double r295212 = r295209 + r295211;
double r295213 = sqrt(r295212);
double r295214 = r295213 + r295208;
double r295215 = r295207 * r295214;
double r295216 = sqrt(r295215);
double r295217 = r295206 * r295216;
return r295217;
}
double f(double re, double im) {
double r295218 = re;
double r295219 = -5.840879447248876e+164;
bool r295220 = r295218 <= r295219;
double r295221 = 0.5;
double r295222 = 2.0;
double r295223 = im;
double r295224 = r295223 * r295223;
double r295225 = -2.0;
double r295226 = r295225 * r295218;
double r295227 = r295224 / r295226;
double r295228 = r295222 * r295227;
double r295229 = sqrt(r295228);
double r295230 = r295221 * r295229;
double r295231 = 9.768996274967368e-287;
bool r295232 = r295218 <= r295231;
double r295233 = sqrt(r295222);
double r295234 = r295218 * r295218;
double r295235 = r295234 + r295224;
double r295236 = sqrt(r295235);
double r295237 = r295236 - r295218;
double r295238 = sqrt(r295237);
double r295239 = r295223 / r295238;
double r295240 = fabs(r295239);
double r295241 = r295233 * r295240;
double r295242 = r295221 * r295241;
double r295243 = 1.9399661775247916e+118;
bool r295244 = r295218 <= r295243;
double r295245 = r295236 + r295218;
double r295246 = r295222 * r295245;
double r295247 = sqrt(r295246);
double r295248 = r295221 * r295247;
double r295249 = 2.0;
double r295250 = r295249 * r295218;
double r295251 = r295222 * r295250;
double r295252 = sqrt(r295251);
double r295253 = r295221 * r295252;
double r295254 = r295244 ? r295248 : r295253;
double r295255 = r295232 ? r295242 : r295254;
double r295256 = r295220 ? r295230 : r295255;
return r295256;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.1 |
|---|---|
| Target | 33.2 |
| Herbie | 19.9 |
if re < -5.840879447248876e+164Initial program 64.0
rmApplied flip-+64.0
Simplified50.7
Taylor expanded around -inf 30.3
if -5.840879447248876e+164 < re < 9.768996274967368e-287Initial program 39.1
rmApplied flip-+39.0
Simplified30.7
rmApplied add-sqr-sqrt30.8
Applied times-frac28.8
rmApplied sqrt-prod28.9
Simplified20.8
if 9.768996274967368e-287 < re < 1.9399661775247916e+118Initial program 19.7
if 1.9399661775247916e+118 < re Initial program 56.0
Taylor expanded around inf 10.2
Final simplification19.9
herbie shell --seed 2020064
(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)))))