Average Error: 38.3 → 15.1
Time: 17.2s
Precision: 64
\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
\[0.5 \cdot \sqrt{\left(re + \left(\left|\sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right| \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}\]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
0.5 \cdot \sqrt{\left(re + \left(\left|\sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right| \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}
double f(double re, double im) {
        double r145605 = 0.5;
        double r145606 = 2.0;
        double r145607 = re;
        double r145608 = r145607 * r145607;
        double r145609 = im;
        double r145610 = r145609 * r145609;
        double r145611 = r145608 + r145610;
        double r145612 = sqrt(r145611);
        double r145613 = r145612 + r145607;
        double r145614 = r145606 * r145613;
        double r145615 = sqrt(r145614);
        double r145616 = r145605 * r145615;
        return r145616;
}

double f(double re, double im) {
        double r145617 = 0.5;
        double r145618 = re;
        double r145619 = im;
        double r145620 = hypot(r145618, r145619);
        double r145621 = cbrt(r145620);
        double r145622 = fabs(r145621);
        double r145623 = sqrt(r145620);
        double r145624 = r145622 * r145623;
        double r145625 = sqrt(r145621);
        double r145626 = r145624 * r145625;
        double r145627 = r145618 + r145626;
        double r145628 = 2.0;
        double r145629 = r145627 * r145628;
        double r145630 = sqrt(r145629);
        double r145631 = r145617 * r145630;
        return r145631;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original38.3
Target33.3
Herbie15.1
\[\begin{array}{l} \mathbf{if}\;re \lt 0.0:\\ \;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \end{array}\]

Derivation

  1. Initial program 38.3

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

    \[\leadsto \color{blue}{0.5 \cdot \sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2}}\]
  3. Using strategy rm
  4. Applied add-sqr-sqrt14.5

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \color{blue}{\sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}\]
  5. Using strategy rm
  6. Applied add-cube-cbrt15.2

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\color{blue}{\left(\sqrt[3]{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right) \cdot \sqrt[3]{\mathsf{hypot}\left(re, im\right)}}}\right) \cdot 2}\]
  7. Applied sqrt-prod15.0

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \color{blue}{\left(\sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt[3]{\mathsf{hypot}\left(re, im\right)}} \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right)}\right) \cdot 2}\]
  8. Applied associate-*r*15.1

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \color{blue}{\left(\sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}}\right) \cdot 2}\]
  9. Simplified15.1

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \color{blue}{\left(\left|\sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right| \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)} \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}\]
  10. Final simplification15.1

    \[\leadsto 0.5 \cdot \sqrt{\left(re + \left(\left|\sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right| \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}\]

Reproduce

herbie shell --seed 2019198 +o rules:numerics
(FPCore (re im)
  :name "math.sqrt on complex, real part"

  :herbie-target
  (if (< re 0.0) (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))

  (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))