Average Error: 37.3 → 13.0
Time: 19.5s
Precision: 64
\[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\sqrt{\left(\sqrt{re^2 + im^2}^* - re\right) \cdot 2.0} \cdot 0.5\]
double f(double re, double im) {
        double r427506 = 0.5;
        double r427507 = 2.0;
        double r427508 = re;
        double r427509 = r427508 * r427508;
        double r427510 = im;
        double r427511 = r427510 * r427510;
        double r427512 = r427509 + r427511;
        double r427513 = sqrt(r427512);
        double r427514 = r427513 - r427508;
        double r427515 = r427507 * r427514;
        double r427516 = sqrt(r427515);
        double r427517 = r427506 * r427516;
        return r427517;
}

double f(double re, double im) {
        double r427518 = re;
        double r427519 = im;
        double r427520 = hypot(r427518, r427519);
        double r427521 = r427520 - r427518;
        double r427522 = 2.0;
        double r427523 = r427521 * r427522;
        double r427524 = sqrt(r427523);
        double r427525 = 0.5;
        double r427526 = r427524 * r427525;
        return r427526;
}

0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}
\sqrt{\left(\sqrt{re^2 + im^2}^* - re\right) \cdot 2.0} \cdot 0.5

Error

Bits error versus re

Bits error versus im

Derivation

  1. Initial program 37.3

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

    \[\leadsto \color{blue}{0.5 \cdot \sqrt{\left(\sqrt{re^2 + im^2}^* - re\right) \cdot 2.0}}\]
  3. Final simplification13.0

    \[\leadsto \sqrt{\left(\sqrt{re^2 + im^2}^* - re\right) \cdot 2.0} \cdot 0.5\]

Reproduce

herbie shell --seed 2019102 +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)))))