Average Error: 37.4 → 12.9
Time: 22.6s
Precision: 64
\[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2.0} \cdot 0.5\]
0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}
\sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2.0} \cdot 0.5
double f(double re, double im) {
        double r438169 = 0.5;
        double r438170 = 2.0;
        double r438171 = re;
        double r438172 = r438171 * r438171;
        double r438173 = im;
        double r438174 = r438173 * r438173;
        double r438175 = r438172 + r438174;
        double r438176 = sqrt(r438175);
        double r438177 = r438176 - r438171;
        double r438178 = r438170 * r438177;
        double r438179 = sqrt(r438178);
        double r438180 = r438169 * r438179;
        return r438180;
}

double f(double re, double im) {
        double r438181 = re;
        double r438182 = im;
        double r438183 = hypot(r438181, r438182);
        double r438184 = r438183 - r438181;
        double r438185 = 2.0;
        double r438186 = r438184 * r438185;
        double r438187 = sqrt(r438186);
        double r438188 = 0.5;
        double r438189 = r438187 * r438188;
        return r438189;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 37.4

    \[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
  2. Simplified12.9

    \[\leadsto \color{blue}{0.5 \cdot \sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2.0}}\]
  3. Final simplification12.9

    \[\leadsto \sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2.0} \cdot 0.5\]

Reproduce

herbie shell --seed 2019124 +o rules:numerics
(FPCore (re im)
  :name "math.sqrt on complex, imaginary part, im greater than 0 branch"
  (* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))