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 r130291 = 0.5;
double r130292 = 2.0;
double r130293 = re;
double r130294 = r130293 * r130293;
double r130295 = im;
double r130296 = r130295 * r130295;
double r130297 = r130294 + r130296;
double r130298 = sqrt(r130297);
double r130299 = r130298 + r130293;
double r130300 = r130292 * r130299;
double r130301 = sqrt(r130300);
double r130302 = r130291 * r130301;
return r130302;
}
double f(double re, double im) {
double r130303 = re;
double r130304 = -8.500232528907394e-258;
bool r130305 = r130303 <= r130304;
double r130306 = 0.5;
double r130307 = 2.0;
double r130308 = im;
double r130309 = 2.0;
double r130310 = pow(r130308, r130309);
double r130311 = r130303 * r130303;
double r130312 = r130308 * r130308;
double r130313 = r130311 + r130312;
double r130314 = sqrt(r130313);
double r130315 = r130314 - r130303;
double r130316 = r130310 / r130315;
double r130317 = r130307 * r130316;
double r130318 = sqrt(r130317);
double r130319 = r130306 * r130318;
double r130320 = 3.6148118604621735e-246;
bool r130321 = r130303 <= r130320;
double r130322 = r130308 + r130303;
double r130323 = r130307 * r130322;
double r130324 = sqrt(r130323);
double r130325 = r130306 * r130324;
double r130326 = 8.439330033545885e+67;
bool r130327 = r130303 <= r130326;
double r130328 = r130314 + r130303;
double r130329 = r130307 * r130328;
double r130330 = sqrt(r130329);
double r130331 = r130306 * r130330;
double r130332 = r130309 * r130303;
double r130333 = r130307 * r130332;
double r130334 = sqrt(r130333);
double r130335 = r130306 * r130334;
double r130336 = r130327 ? r130331 : r130335;
double r130337 = r130321 ? r130325 : r130336;
double r130338 = r130305 ? r130319 : r130337;
return r130338;
}




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
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
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)))))