0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -63004759056113188486294445701334040576:\\
\;\;\;\;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 r196066 = 0.5;
double r196067 = 2.0;
double r196068 = re;
double r196069 = r196068 * r196068;
double r196070 = im;
double r196071 = r196070 * r196070;
double r196072 = r196069 + r196071;
double r196073 = sqrt(r196072);
double r196074 = r196073 + r196068;
double r196075 = r196067 * r196074;
double r196076 = sqrt(r196075);
double r196077 = r196066 * r196076;
return r196077;
}
double f(double re, double im) {
double r196078 = re;
double r196079 = -6.300475905611319e+37;
bool r196080 = r196078 <= r196079;
double r196081 = 0.5;
double r196082 = 2.0;
double r196083 = im;
double r196084 = r196083 * r196083;
double r196085 = hypot(r196078, r196083);
double r196086 = r196085 - r196078;
double r196087 = r196084 / r196086;
double r196088 = r196082 * r196087;
double r196089 = sqrt(r196088);
double r196090 = r196081 * r196089;
double r196091 = 1.0;
double r196092 = r196078 + r196085;
double r196093 = r196091 * r196092;
double r196094 = r196082 * r196093;
double r196095 = sqrt(r196094);
double r196096 = r196081 * r196095;
double r196097 = r196080 ? r196090 : r196096;
return r196097;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.4 |
|---|---|
| Target | 33.1 |
| Herbie | 11.5 |
if re < -6.300475905611319e+37Initial program 58.7
rmApplied flip-+58.7
Simplified41.0
Simplified31.4
if -6.300475905611319e+37 < re Initial program 32.9
rmApplied *-un-lft-identity32.9
Applied *-un-lft-identity32.9
Applied distribute-lft-out32.9
Simplified6.1
Final simplification11.5
herbie shell --seed 2019346 +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)))))