Average Error: 38.3 → 26.7
Time: 4.4s
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 -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\ \mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\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 -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\

\mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\

\mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\

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

\end{array}
double f(double re, double im) {
        double r150306 = 0.5;
        double r150307 = 2.0;
        double r150308 = re;
        double r150309 = r150308 * r150308;
        double r150310 = im;
        double r150311 = r150310 * r150310;
        double r150312 = r150309 + r150311;
        double r150313 = sqrt(r150312);
        double r150314 = r150313 + r150308;
        double r150315 = r150307 * r150314;
        double r150316 = sqrt(r150315);
        double r150317 = r150306 * r150316;
        return r150317;
}

double f(double re, double im) {
        double r150318 = re;
        double r150319 = -8.500232528907394e-258;
        bool r150320 = r150318 <= r150319;
        double r150321 = 0.5;
        double r150322 = 2.0;
        double r150323 = im;
        double r150324 = 2.0;
        double r150325 = pow(r150323, r150324);
        double r150326 = r150318 * r150318;
        double r150327 = r150323 * r150323;
        double r150328 = r150326 + r150327;
        double r150329 = sqrt(r150328);
        double r150330 = r150329 - r150318;
        double r150331 = r150325 / r150330;
        double r150332 = r150322 * r150331;
        double r150333 = sqrt(r150332);
        double r150334 = r150321 * r150333;
        double r150335 = 3.6148118604621735e-246;
        bool r150336 = r150318 <= r150335;
        double r150337 = r150323 + r150318;
        double r150338 = r150322 * r150337;
        double r150339 = sqrt(r150338);
        double r150340 = r150321 * r150339;
        double r150341 = 8.439330033545885e+67;
        bool r150342 = r150318 <= r150341;
        double r150343 = r150329 + r150318;
        double r150344 = r150322 * r150343;
        double r150345 = sqrt(r150344);
        double r150346 = r150321 * r150345;
        double r150347 = r150318 + r150318;
        double r150348 = r150322 * r150347;
        double r150349 = sqrt(r150348);
        double r150350 = r150321 * r150349;
        double r150351 = r150342 ? r150346 : r150350;
        double r150352 = r150336 ? r150340 : r150351;
        double r150353 = r150320 ? r150334 : r150352;
        return r150353;
}

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.4
Herbie26.7
\[\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 4 regimes
  2. if re < -8.500232528907394e-258

    1. Initial program 46.6

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Using strategy rm
    3. Applied flip-+46.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. Simplified35.9

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

    if -8.500232528907394e-258 < re < 3.6148118604621735e-246

    1. Initial program 30.4

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Using strategy rm
    3. Applied add-exp-log32.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{e^{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}} + re\right)}\]
    4. Using strategy rm
    5. Applied pow1/232.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\log \color{blue}{\left({\left(re \cdot re + im \cdot im\right)}^{\frac{1}{2}}\right)}} + re\right)}\]
    6. Applied log-pow32.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\color{blue}{\frac{1}{2} \cdot \log \left(re \cdot re + im \cdot im\right)}} + re\right)}\]
    7. Applied exp-prod32.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{{\left(e^{\frac{1}{2}}\right)}^{\left(\log \left(re \cdot re + im \cdot im\right)\right)}} + re\right)}\]
    8. Taylor expanded around 0 32.3

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{im} + re\right)}\]

    if 3.6148118604621735e-246 < re < 8.439330033545885e+67

    1. Initial program 19.4

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

    if 8.439330033545885e+67 < re

    1. Initial program 46.7

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Using strategy rm
    3. Applied add-cube-cbrt46.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\color{blue}{\left(\sqrt[3]{re \cdot re + im \cdot im} \cdot \sqrt[3]{re \cdot re + im \cdot im}\right) \cdot \sqrt[3]{re \cdot re + im \cdot im}}} + re\right)}\]
    4. Taylor expanded around inf 12.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{re} + re\right)}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification26.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\ \mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2020001 
(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)))))