0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \le -1.47033881827273 \cdot 10^{-87} \lor \neg \left(im \le -1.1781651487664911 \cdot 10^{-125} \lor \neg \left(im \le 1.0908647843737489 \cdot 10^{-38} \lor \neg \left(im \le 6.702754729213891 \cdot 10^{102}\right)\right)\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \mathsf{hypot}\left(re, im\right) + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\end{array}double f(double re, double im) {
double r318266 = 0.5;
double r318267 = 2.0;
double r318268 = re;
double r318269 = r318268 * r318268;
double r318270 = im;
double r318271 = r318270 * r318270;
double r318272 = r318269 + r318271;
double r318273 = sqrt(r318272);
double r318274 = r318273 + r318268;
double r318275 = r318267 * r318274;
double r318276 = sqrt(r318275);
double r318277 = r318266 * r318276;
return r318277;
}
double f(double re, double im) {
double r318278 = im;
double r318279 = -1.47033881827273e-87;
bool r318280 = r318278 <= r318279;
double r318281 = -1.1781651487664911e-125;
bool r318282 = r318278 <= r318281;
double r318283 = 1.090864784373749e-38;
bool r318284 = r318278 <= r318283;
double r318285 = 6.702754729213891e+102;
bool r318286 = r318278 <= r318285;
double r318287 = !r318286;
bool r318288 = r318284 || r318287;
double r318289 = !r318288;
bool r318290 = r318282 || r318289;
double r318291 = !r318290;
bool r318292 = r318280 || r318291;
double r318293 = 0.5;
double r318294 = 2.0;
double r318295 = 1.0;
double r318296 = re;
double r318297 = hypot(r318296, r318278);
double r318298 = r318295 * r318297;
double r318299 = r318298 + r318296;
double r318300 = r318294 * r318299;
double r318301 = sqrt(r318300);
double r318302 = r318293 * r318301;
double r318303 = 2.0;
double r318304 = pow(r318278, r318303);
double r318305 = r318297 - r318296;
double r318306 = r318304 / r318305;
double r318307 = r318294 * r318306;
double r318308 = sqrt(r318307);
double r318309 = r318293 * r318308;
double r318310 = r318292 ? r318302 : r318309;
return r318310;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 33.9 |
| Herbie | 13.4 |
if im < -1.47033881827273e-87 or -1.1781651487664911e-125 < im < 1.090864784373749e-38 or 6.702754729213891e+102 < im Initial program 41.5
rmApplied *-un-lft-identity41.5
Applied sqrt-prod41.5
Simplified41.5
Simplified12.8
if -1.47033881827273e-87 < im < -1.1781651487664911e-125 or 1.090864784373749e-38 < im < 6.702754729213891e+102Initial program 23.2
rmApplied flip-+30.3
Simplified23.1
Simplified17.5
Final simplification13.4
herbie shell --seed 2020033 +o rules:numerics
(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)))))