Average Error: 2.0 → 1.2
Time: 17.5s
Precision: 64
\[\left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) - re\right)\right)}\right)\]
\[\begin{array}{l} \mathbf{if}\;re \le 0.876953125:\\ \;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \frac{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot \left(im \cdot im\right)}{\left(\sqrt{re \cdot re + im \cdot im} + re\right) \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}}\\ \end{array}\]
\left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) - re\right)\right)}\right)
\begin{array}{l}
\mathbf{if}\;re \le 0.876953125:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \frac{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot \left(im \cdot im\right)}{\left(\sqrt{re \cdot re + im \cdot im} + re\right) \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}}\\

\end{array}
double f(double re, double im) {
        double r807433 = 0.5;
        double r807434 = /* ERROR: no posit support in C */;
        double r807435 = 2.0;
        double r807436 = /* ERROR: no posit support in C */;
        double r807437 = re;
        double r807438 = r807437 * r807437;
        double r807439 = im;
        double r807440 = r807439 * r807439;
        double r807441 = r807438 + r807440;
        double r807442 = sqrt(r807441);
        double r807443 = r807442 - r807437;
        double r807444 = r807436 * r807443;
        double r807445 = sqrt(r807444);
        double r807446 = r807434 * r807445;
        return r807446;
}

double f(double re, double im) {
        double r807447 = re;
        double r807448 = 0.876953125;
        bool r807449 = r807447 <= r807448;
        double r807450 = 0.5;
        double r807451 = 2.0;
        double r807452 = r807447 * r807447;
        double r807453 = im;
        double r807454 = r807453 * r807453;
        double r807455 = r807452 + r807454;
        double r807456 = sqrt(r807455);
        double r807457 = r807456 - r807447;
        double r807458 = r807451 * r807457;
        double r807459 = sqrt(r807458);
        double r807460 = r807450 * r807459;
        double r807461 = r807454 + r807452;
        double r807462 = sqrt(r807461);
        double r807463 = r807447 + r807462;
        double r807464 = r807463 * r807454;
        double r807465 = r807456 + r807447;
        double r807466 = r807465 * r807465;
        double r807467 = r807464 / r807466;
        double r807468 = r807451 * r807467;
        double r807469 = sqrt(r807468);
        double r807470 = r807450 * r807469;
        double r807471 = r807449 ? r807460 : r807470;
        return r807471;
}

Error

Bits error versus re

Bits error versus im

Derivation

  1. Split input into 2 regimes
  2. if re < 0.876953125

    1. Initial program 0.8

      \[\left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) - re\right)\right)}\right)\]

    if 0.876953125 < re

    1. Initial program 5.3

      \[\left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) - re\right)\right)}\right)\]
    2. Using strategy rm
    3. Applied p16-flip--4.7

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \color{blue}{\left(\frac{\left(\left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) \cdot \left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)\right) - \left(re \cdot re\right)\right)}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)}\right)}\right)\]
    4. Using strategy rm
    5. Applied difference-of-squares5.3

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\frac{\color{blue}{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) - re\right)\right)}}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)\right)}\right)\]
    6. Using strategy rm
    7. Applied p16-flip--4.7

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\frac{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \color{blue}{\left(\frac{\left(\left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) \cdot \left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)\right) - \left(re \cdot re\right)\right)}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)}\right)}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)\right)}\right)\]
    8. Applied associate-*r/5.3

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\frac{\color{blue}{\left(\frac{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \left(\left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) \cdot \left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)\right) - \left(re \cdot re\right)\right)\right)}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)}}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)\right)}\right)\]
    9. Applied associate-/l/5.3

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \color{blue}{\left(\frac{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \left(\left(\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right) \cdot \left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)\right) - \left(re \cdot re\right)\right)\right)}{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)\right)}\right)}\right)}\right)\]
    10. Simplified2.1

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\frac{\color{blue}{\left(\left(\frac{re}{\left(\sqrt{\left(\frac{\left(im \cdot im\right)}{\left(re \cdot re\right)}\right)}\right)}\right) \cdot \left(im \cdot im\right)\right)}}{\left(\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right) \cdot \left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)\right)}\right)\right)}\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.2

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 0.876953125:\\ \;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \frac{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot \left(im \cdot im\right)}{\left(\sqrt{re \cdot re + im \cdot im} + re\right) \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}}\\ \end{array}\]

Reproduce

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