Average Error: 38.4 → 13.2
Time: 4.1s
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 6.83037648753660603 \cdot 10^{-73} \lor \neg \left(re \le 1.969774278625561 \cdot 10^{-16}\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(\mathsf{hypot}\left(re, im\right) - re\right)\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\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 6.83037648753660603 \cdot 10^{-73} \lor \neg \left(re \le 1.969774278625561 \cdot 10^{-16}\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(\mathsf{hypot}\left(re, im\right) - re\right)\right)}\\

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

\end{array}
double f(double re, double im) {
        double r18361 = 0.5;
        double r18362 = 2.0;
        double r18363 = re;
        double r18364 = r18363 * r18363;
        double r18365 = im;
        double r18366 = r18365 * r18365;
        double r18367 = r18364 + r18366;
        double r18368 = sqrt(r18367);
        double r18369 = r18368 - r18363;
        double r18370 = r18362 * r18369;
        double r18371 = sqrt(r18370);
        double r18372 = r18361 * r18371;
        return r18372;
}

double f(double re, double im) {
        double r18373 = re;
        double r18374 = 6.830376487536606e-73;
        bool r18375 = r18373 <= r18374;
        double r18376 = 1.969774278625561e-16;
        bool r18377 = r18373 <= r18376;
        double r18378 = !r18377;
        bool r18379 = r18375 || r18378;
        double r18380 = 0.5;
        double r18381 = 2.0;
        double r18382 = 1.0;
        double r18383 = im;
        double r18384 = hypot(r18373, r18383);
        double r18385 = r18384 - r18373;
        double r18386 = r18382 * r18385;
        double r18387 = r18381 * r18386;
        double r18388 = sqrt(r18387);
        double r18389 = r18380 * r18388;
        double r18390 = 2.0;
        double r18391 = pow(r18383, r18390);
        double r18392 = 0.0;
        double r18393 = r18391 + r18392;
        double r18394 = r18373 + r18384;
        double r18395 = r18393 / r18394;
        double r18396 = r18381 * r18395;
        double r18397 = sqrt(r18396);
        double r18398 = r18380 * r18397;
        double r18399 = r18379 ? r18389 : r18398;
        return r18399;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 2 regimes
  2. if re < 6.830376487536606e-73 or 1.969774278625561e-16 < re

    1. Initial program 38.2

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

      \[\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-identity38.2

      \[\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-out--38.2

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

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

    if 6.830376487536606e-73 < re < 1.969774278625561e-16

    1. Initial program 42.5

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

      \[\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. Simplified31.6

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{{im}^{2} + 0}}{\sqrt{re \cdot re + im \cdot im} + re}}\]
    5. Simplified31.6

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 6.83037648753660603 \cdot 10^{-73} \lor \neg \left(re \le 1.969774278625561 \cdot 10^{-16}\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \left(\mathsf{hypot}\left(re, im\right) - re\right)\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\right)}}\\ \end{array}\]

Reproduce

herbie shell --seed 2020027 +o rules:numerics
(FPCore (re im)
  :name "math.sqrt on complex, imaginary part, im greater than 0 branch"
  :precision binary64
  (* 0.5 (sqrt (* 2 (- (sqrt (+ (* re re) (* im im))) re)))))