Average Error: 38.3 → 26.7
Time: 4.2s
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(2 \cdot 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(2 \cdot re\right)}\\

\end{array}
double f(double re, double im) {
        double r130291 = 0.5;
        double r130292 = 2.0;
        double r130293 = re;
        double r130294 = r130293 * r130293;
        double r130295 = im;
        double r130296 = r130295 * r130295;
        double r130297 = r130294 + r130296;
        double r130298 = sqrt(r130297);
        double r130299 = r130298 + r130293;
        double r130300 = r130292 * r130299;
        double r130301 = sqrt(r130300);
        double r130302 = r130291 * r130301;
        return r130302;
}

double f(double re, double im) {
        double r130303 = re;
        double r130304 = -8.500232528907394e-258;
        bool r130305 = r130303 <= r130304;
        double r130306 = 0.5;
        double r130307 = 2.0;
        double r130308 = im;
        double r130309 = 2.0;
        double r130310 = pow(r130308, r130309);
        double r130311 = r130303 * r130303;
        double r130312 = r130308 * r130308;
        double r130313 = r130311 + r130312;
        double r130314 = sqrt(r130313);
        double r130315 = r130314 - r130303;
        double r130316 = r130310 / r130315;
        double r130317 = r130307 * r130316;
        double r130318 = sqrt(r130317);
        double r130319 = r130306 * r130318;
        double r130320 = 3.6148118604621735e-246;
        bool r130321 = r130303 <= r130320;
        double r130322 = r130308 + r130303;
        double r130323 = r130307 * r130322;
        double r130324 = sqrt(r130323);
        double r130325 = r130306 * r130324;
        double r130326 = 8.439330033545885e+67;
        bool r130327 = r130303 <= r130326;
        double r130328 = r130314 + r130303;
        double r130329 = r130307 * r130328;
        double r130330 = sqrt(r130329);
        double r130331 = r130306 * r130330;
        double r130332 = r130309 * r130303;
        double r130333 = r130307 * r130332;
        double r130334 = sqrt(r130333);
        double r130335 = r130306 * r130334;
        double r130336 = r130327 ? r130331 : r130335;
        double r130337 = r130321 ? r130325 : r130336;
        double r130338 = r130305 ? r130319 : r130337;
        return r130338;
}

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. 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. Taylor expanded around inf 12.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(2 \cdot 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(2 \cdot 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)))))