Average Error: 38.3 → 12.5
Time: 3.9s
Precision: 64
\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
\[\begin{array}{l} \mathbf{if}\;re \le -1.133313274499030129257633800115220556404 \cdot 10^{228} \lor \neg \left(re \le -9.345587729548567513972046947617561809913 \cdot 10^{128} \lor \neg \left(re \le -1.14256559511830479002291702476221749434 \cdot 10^{-14}\right)\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)\right)}\\ \end{array}\]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
\mathbf{if}\;re \le -1.133313274499030129257633800115220556404 \cdot 10^{228} \lor \neg \left(re \le -9.345587729548567513972046947617561809913 \cdot 10^{128} \lor \neg \left(re \le -1.14256559511830479002291702476221749434 \cdot 10^{-14}\right)\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)\right)}\\

\end{array}
double f(double re, double im) {
        double r284157 = 0.5;
        double r284158 = 2.0;
        double r284159 = re;
        double r284160 = r284159 * r284159;
        double r284161 = im;
        double r284162 = r284161 * r284161;
        double r284163 = r284160 + r284162;
        double r284164 = sqrt(r284163);
        double r284165 = r284164 + r284159;
        double r284166 = r284158 * r284165;
        double r284167 = sqrt(r284166);
        double r284168 = r284157 * r284167;
        return r284168;
}

double f(double re, double im) {
        double r284169 = re;
        double r284170 = -1.1333132744990301e+228;
        bool r284171 = r284169 <= r284170;
        double r284172 = -9.345587729548568e+128;
        bool r284173 = r284169 <= r284172;
        double r284174 = -1.1425655951183048e-14;
        bool r284175 = r284169 <= r284174;
        double r284176 = !r284175;
        bool r284177 = r284173 || r284176;
        double r284178 = !r284177;
        bool r284179 = r284171 || r284178;
        double r284180 = 0.5;
        double r284181 = 2.0;
        double r284182 = im;
        double r284183 = r284182 * r284182;
        double r284184 = -1.0;
        double r284185 = hypot(r284169, r284182);
        double r284186 = fma(r284184, r284169, r284185);
        double r284187 = r284183 / r284186;
        double r284188 = r284181 * r284187;
        double r284189 = sqrt(r284188);
        double r284190 = r284180 * r284189;
        double r284191 = 1.0;
        double r284192 = sqrt(r284185);
        double r284193 = r284192 * r284192;
        double r284194 = r284169 + r284193;
        double r284195 = r284191 * r284194;
        double r284196 = r284181 * r284195;
        double r284197 = sqrt(r284196);
        double r284198 = r284180 * r284197;
        double r284199 = r284179 ? r284190 : r284198;
        return r284199;
}

Error

Bits error versus re

Bits error versus im

Target

Original38.3
Target33.3
Herbie12.5
\[\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. Split input into 2 regimes
  2. if re < -1.1333132744990301e+228 or -9.345587729548568e+128 < re < -1.1425655951183048e-14

    1. Initial program 54.4

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Using strategy rm
    3. Applied flip-+54.4

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\frac{\sqrt{re \cdot re + im \cdot im} \cdot \sqrt{re \cdot re + im \cdot im} - re \cdot re}{\sqrt{re \cdot re + im \cdot im} - re}}}\]
    4. Simplified37.3

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{im \cdot im}}{\sqrt{re \cdot re + im \cdot im} - re}}\]
    5. Simplified30.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\color{blue}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}}}\]

    if -1.1333132744990301e+228 < re < -9.345587729548568e+128 or -1.1425655951183048e-14 < re

    1. Initial program 34.8

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Using strategy rm
    3. Applied *-un-lft-identity34.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + \color{blue}{1 \cdot re}\right)}\]
    4. Applied *-un-lft-identity34.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{1 \cdot \sqrt{re \cdot re + im \cdot im}} + 1 \cdot re\right)}\]
    5. Applied distribute-lft-out34.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(1 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)}}\]
    6. Simplified8.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \color{blue}{\left(re + \mathsf{hypot}\left(re, im\right)\right)}\right)}\]
    7. Using strategy rm
    8. Applied add-sqr-sqrt8.7

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(re + \color{blue}{\sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}}\right)\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification12.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -1.133313274499030129257633800115220556404 \cdot 10^{228} \lor \neg \left(re \le -9.345587729548567513972046947617561809913 \cdot 10^{128} \lor \neg \left(re \le -1.14256559511830479002291702476221749434 \cdot 10^{-14}\right)\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)\right)}\\ \end{array}\]

Reproduce

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

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

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