double f(double re, double im) {
double r37946246 = 0.5;
double r37946247 = 2.0;
double r37946248 = re;
double r37946249 = r37946248 * r37946248;
double r37946250 = im;
double r37946251 = r37946250 * r37946250;
double r37946252 = r37946249 + r37946251;
double r37946253 = sqrt(r37946252);
double r37946254 = r37946253 + r37946248;
double r37946255 = r37946247 * r37946254;
double r37946256 = sqrt(r37946255);
double r37946257 = r37946246 * r37946256;
return r37946257;
}
double f(double re, double im) {
double r37946258 = re;
double r37946259 = -7.674549697368973e-232;
bool r37946260 = r37946258 <= r37946259;
double r37946261 = im;
double r37946262 = r37946261 * r37946261;
double r37946263 = 2.0;
double r37946264 = r37946262 * r37946263;
double r37946265 = sqrt(r37946264);
double r37946266 = r37946258 * r37946258;
double r37946267 = r37946262 + r37946266;
double r37946268 = sqrt(r37946267);
double r37946269 = r37946268 - r37946258;
double r37946270 = sqrt(r37946269);
double r37946271 = r37946265 / r37946270;
double r37946272 = 0.5;
double r37946273 = r37946271 * r37946272;
double r37946274 = 7057901.046632865;
bool r37946275 = r37946258 <= r37946274;
double r37946276 = r37946258 + r37946268;
double r37946277 = r37946263 * r37946276;
double r37946278 = sqrt(r37946277);
double r37946279 = r37946278 * r37946272;
double r37946280 = r37946258 + r37946258;
double r37946281 = r37946263 * r37946280;
double r37946282 = sqrt(r37946281);
double r37946283 = r37946282 * r37946272;
double r37946284 = r37946275 ? r37946279 : r37946283;
double r37946285 = r37946260 ? r37946273 : r37946284;
return r37946285;
}
0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -7.674549697368973 \cdot 10^{-232}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2.0}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}} \cdot 0.5\\
\mathbf{elif}\;re \le 7057901.046632865:\\
\;\;\;\;\sqrt{2.0 \cdot \left(re + \sqrt{im \cdot im + re \cdot re}\right)} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(re + re\right)} \cdot 0.5\\
\end{array}



Bits error versus re




Bits error versus im
| Original | 37.1 |
|---|---|
| Target | 32.0 |
| Herbie | 25.8 |
if re < -7.674549697368973e-232Initial program 47.3
rmApplied flip-+47.3
Applied associate-*r/47.3
Applied sqrt-div47.4
Simplified34.6
if -7.674549697368973e-232 < re < 7057901.046632865Initial program 22.6
if 7057901.046632865 < re Initial program 38.0
Taylor expanded around inf 14.6
Final simplification25.8
herbie shell --seed 2019101
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (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)))))