0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -374104356870144197000:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)\right)}\\
\end{array}double f(double re, double im) {
double r203788 = 0.5;
double r203789 = 2.0;
double r203790 = re;
double r203791 = r203790 * r203790;
double r203792 = im;
double r203793 = r203792 * r203792;
double r203794 = r203791 + r203793;
double r203795 = sqrt(r203794);
double r203796 = r203795 + r203790;
double r203797 = r203789 * r203796;
double r203798 = sqrt(r203797);
double r203799 = r203788 * r203798;
return r203799;
}
double f(double re, double im) {
double r203800 = re;
double r203801 = -3.741043568701442e+20;
bool r203802 = r203800 <= r203801;
double r203803 = 0.5;
double r203804 = 2.0;
double r203805 = im;
double r203806 = r203805 * r203805;
double r203807 = hypot(r203800, r203805);
double r203808 = r203807 - r203800;
double r203809 = r203806 / r203808;
double r203810 = r203804 * r203809;
double r203811 = sqrt(r203810);
double r203812 = r203803 * r203811;
double r203813 = 1.0;
double r203814 = r203800 + r203807;
double r203815 = r203813 * r203814;
double r203816 = r203804 * r203815;
double r203817 = sqrt(r203816);
double r203818 = r203803 * r203817;
double r203819 = r203802 ? r203812 : r203818;
return r203819;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.7 |
|---|---|
| Target | 33.5 |
| Herbie | 11.2 |
if re < -3.741043568701442e+20Initial program 58.4
rmApplied flip-+58.4
Simplified41.7
Simplified30.1
if -3.741043568701442e+20 < re Initial program 32.7
rmApplied *-un-lft-identity32.7
Applied *-un-lft-identity32.7
Applied distribute-lft-out32.7
Simplified5.5
Final simplification11.2
herbie shell --seed 2020056 +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)))))