Average Error: 2.0 → 0.8
Time: 11.9s
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.014678955078125:\\ \;\;\;\;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{im}{\frac{\sqrt{re \cdot re + im \cdot im} + re}{im}}}\\ \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.014678955078125:\\
\;\;\;\;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{im}{\frac{\sqrt{re \cdot re + im \cdot im} + re}{im}}}\\

\end{array}
double f(double re, double im) {
        double r1001958 = 0.5;
        double r1001959 = /* ERROR: no posit support in C */;
        double r1001960 = 2.0;
        double r1001961 = /* ERROR: no posit support in C */;
        double r1001962 = re;
        double r1001963 = r1001962 * r1001962;
        double r1001964 = im;
        double r1001965 = r1001964 * r1001964;
        double r1001966 = r1001963 + r1001965;
        double r1001967 = sqrt(r1001966);
        double r1001968 = r1001967 - r1001962;
        double r1001969 = r1001961 * r1001968;
        double r1001970 = sqrt(r1001969);
        double r1001971 = r1001959 * r1001970;
        return r1001971;
}

double f(double re, double im) {
        double r1001972 = re;
        double r1001973 = -0.014678955078125;
        bool r1001974 = r1001972 <= r1001973;
        double r1001975 = 0.5;
        double r1001976 = 2.0;
        double r1001977 = r1001972 * r1001972;
        double r1001978 = im;
        double r1001979 = r1001978 * r1001978;
        double r1001980 = r1001977 + r1001979;
        double r1001981 = sqrt(r1001980);
        double r1001982 = r1001981 - r1001972;
        double r1001983 = r1001976 * r1001982;
        double r1001984 = sqrt(r1001983);
        double r1001985 = r1001975 * r1001984;
        double r1001986 = r1001981 + r1001972;
        double r1001987 = r1001986 / r1001978;
        double r1001988 = r1001978 / r1001987;
        double r1001989 = r1001976 * r1001988;
        double r1001990 = sqrt(r1001989);
        double r1001991 = r1001975 * r1001990;
        double r1001992 = r1001974 ? r1001985 : r1001991;
        return r1001992;
}

Error

Bits error versus re

Bits error versus im

Derivation

  1. Split input into 2 regimes
  2. if re < -0.014678955078125

    1. Initial program 0.7

      \[\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.014678955078125 < re

    1. Initial program 3.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--3.0

      \[\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. Simplified0.9

      \[\leadsto \left(0.5\right) \cdot \left(\sqrt{\left(\left(2.0\right) \cdot \left(\frac{\color{blue}{\left(im \cdot im\right)}}{\left(\frac{\left(\sqrt{\left(\frac{\left(re \cdot re\right)}{\left(im \cdot im\right)}\right)}\right)}{re}\right)}\right)\right)}\right)\]
    5. Using strategy rm
    6. Applied associate-/l*0.8

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -0.014678955078125:\\ \;\;\;\;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{im}{\frac{\sqrt{re \cdot re + im \cdot im} + re}{im}}}\\ \end{array}\]

Reproduce

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