math.sqrt on complex, real part

Percentage Accurate: 40.9% → 90.1%
Time: 10.7s
Alternatives: 8
Speedup: 1.9×

Specification

?
\[\begin{array}{l} \\ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \end{array} \]
(FPCore (re im)
 :precision binary64
 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
double code(double re, double im) {
	return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
real(8) function code(re, im)
    real(8), intent (in) :: re
    real(8), intent (in) :: im
    code = 0.5d0 * sqrt((2.0d0 * (sqrt(((re * re) + (im * im))) + re)))
end function
public static double code(double re, double im) {
	return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
def code(re, im):
	return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
function code(re, im)
	return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re))))
end
function tmp = code(re, im)
	tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
end
code[re_, im_] := N[(0.5 * N[Sqrt[N[(2.0 * N[(N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\end{array}

Sampling outcomes in binary64 precision:

Local Percentage Accuracy vs ?

The average percentage accuracy by input value. Horizontal axis shows value of an input variable; the variable is choosen in the title. Vertical axis is accuracy; higher is better. Red represent the original program, while blue represents Herbie's suggestion. These can be toggled with buttons below the plot. The line is an average while dots represent individual samples.

Accuracy vs Speed?

Herbie found 8 alternatives:

AlternativeAccuracySpeedup
The accuracy (vertical axis) and speed (horizontal axis) of each alternatives. Up and to the right is better. The red square shows the initial program, and each blue circle shows an alternative.The line shows the best available speed-accuracy tradeoffs.

Initial Program: 40.9% accurate, 1.0× speedup?

\[\begin{array}{l} \\ 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \end{array} \]
(FPCore (re im)
 :precision binary64
 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
double code(double re, double im) {
	return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
real(8) function code(re, im)
    real(8), intent (in) :: re
    real(8), intent (in) :: im
    code = 0.5d0 * sqrt((2.0d0 * (sqrt(((re * re) + (im * im))) + re)))
end function
public static double code(double re, double im) {
	return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
def code(re, im):
	return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
function code(re, im)
	return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re))))
end
function tmp = code(re, im)
	tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
end
code[re_, im_] := N[(0.5 * N[Sqrt[N[(2.0 * N[(N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]
\begin{array}{l}

\\
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\end{array}

Alternative 1: 90.1% accurate, 0.7× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re + \sqrt{re \cdot re + im\_m \cdot im\_m} \leq 0:\\ \;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\_m\right)\right)}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= (+ re (sqrt (+ (* re re) (* im_m im_m)))) 0.0)
   (* 0.5 (* im_m (sqrt (/ -1.0 re))))
   (* 0.5 (sqrt (* 2.0 (+ re (hypot re im_m)))))))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if ((re + sqrt(((re * re) + (im_m * im_m)))) <= 0.0) {
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	} else {
		tmp = 0.5 * sqrt((2.0 * (re + hypot(re, im_m))));
	}
	return tmp;
}
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if ((re + Math.sqrt(((re * re) + (im_m * im_m)))) <= 0.0) {
		tmp = 0.5 * (im_m * Math.sqrt((-1.0 / re)));
	} else {
		tmp = 0.5 * Math.sqrt((2.0 * (re + Math.hypot(re, im_m))));
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if (re + math.sqrt(((re * re) + (im_m * im_m)))) <= 0.0:
		tmp = 0.5 * (im_m * math.sqrt((-1.0 / re)))
	else:
		tmp = 0.5 * math.sqrt((2.0 * (re + math.hypot(re, im_m))))
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (Float64(re + sqrt(Float64(Float64(re * re) + Float64(im_m * im_m)))) <= 0.0)
		tmp = Float64(0.5 * Float64(im_m * sqrt(Float64(-1.0 / re))));
	else
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + hypot(re, im_m)))));
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if ((re + sqrt(((re * re) + (im_m * im_m)))) <= 0.0)
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	else
		tmp = 0.5 * sqrt((2.0 * (re + hypot(re, im_m))));
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[N[(re + N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im$95$m * im$95$m), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], 0.0], N[(0.5 * N[(im$95$m * N[Sqrt[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + N[Sqrt[re ^ 2 + im$95$m ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re + \sqrt{re \cdot re + im\_m \cdot im\_m} \leq 0:\\
\;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\

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


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if (+.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re) < 0.0

    1. Initial program 7.6%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f647.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified7.9%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(-1 \cdot \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(0 - \frac{{im}^{2}}{re}\right)\right)\right) \]
      3. --lowering--.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6454.2%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified54.2%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0 - \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      2. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      4. *-lowering-*.f6454.2%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    9. Applied egg-rr54.2%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{-\frac{im \cdot im}{re}}} \]
    10. Step-by-step derivation
      1. div-invN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\mathsf{neg}\left(\left(im \cdot im\right) \cdot \frac{1}{re}\right)}\right)\right) \]
      2. distribute-rgt-neg-inN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\left(im \cdot im\right) \cdot \left(\mathsf{neg}\left(\frac{1}{re}\right)\right)}\right)\right) \]
      3. sqrt-prodN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{im \cdot im} \cdot \color{blue}{\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      4. pow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{{im}^{2}} \cdot \sqrt{\mathsf{neg}\left(\color{blue}{\frac{1}{re}}\right)}\right)\right) \]
      5. sqrt-pow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{\left(\frac{2}{2}\right)} \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      6. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{1} \cdot \sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)\right) \]
      7. unpow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      8. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \color{blue}{\left(\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)}\right)\right) \]
      9. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      10. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      11. /-lowering-/.f6444.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(1, re\right)\right)\right)\right)\right) \]
    11. Applied egg-rr44.9%

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

    if 0.0 < (+.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re)

    1. Initial program 50.9%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6491.5%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified91.5%

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re + \sqrt{re \cdot re + im \cdot im} \leq 0:\\ \;\;\;\;0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}\\ \end{array} \]
  5. Add Preprocessing

Alternative 2: 76.1% accurate, 1.8× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq -1.25 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{im\_m \cdot \left(2 + 2 \cdot \frac{re}{im\_m}\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{re \cdot 4 + im\_m \cdot \frac{im\_m}{re}}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= re -1.25e+34)
   (* 0.5 (* im_m (sqrt (/ -1.0 re))))
   (if (<= re 7.6e-56)
     (* 0.5 (sqrt (* im_m (+ 2.0 (* 2.0 (/ re im_m))))))
     (* 0.5 (sqrt (+ (* re 4.0) (* im_m (/ im_m re))))))))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= -1.25e+34) {
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	} else if (re <= 7.6e-56) {
		tmp = 0.5 * sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	} else {
		tmp = 0.5 * sqrt(((re * 4.0) + (im_m * (im_m / re))));
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= (-1.25d+34)) then
        tmp = 0.5d0 * (im_m * sqrt(((-1.0d0) / re)))
    else if (re <= 7.6d-56) then
        tmp = 0.5d0 * sqrt((im_m * (2.0d0 + (2.0d0 * (re / im_m)))))
    else
        tmp = 0.5d0 * sqrt(((re * 4.0d0) + (im_m * (im_m / re))))
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= -1.25e+34) {
		tmp = 0.5 * (im_m * Math.sqrt((-1.0 / re)));
	} else if (re <= 7.6e-56) {
		tmp = 0.5 * Math.sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	} else {
		tmp = 0.5 * Math.sqrt(((re * 4.0) + (im_m * (im_m / re))));
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= -1.25e+34:
		tmp = 0.5 * (im_m * math.sqrt((-1.0 / re)))
	elif re <= 7.6e-56:
		tmp = 0.5 * math.sqrt((im_m * (2.0 + (2.0 * (re / im_m)))))
	else:
		tmp = 0.5 * math.sqrt(((re * 4.0) + (im_m * (im_m / re))))
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= -1.25e+34)
		tmp = Float64(0.5 * Float64(im_m * sqrt(Float64(-1.0 / re))));
	elseif (re <= 7.6e-56)
		tmp = Float64(0.5 * sqrt(Float64(im_m * Float64(2.0 + Float64(2.0 * Float64(re / im_m))))));
	else
		tmp = Float64(0.5 * sqrt(Float64(Float64(re * 4.0) + Float64(im_m * Float64(im_m / re)))));
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= -1.25e+34)
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	elseif (re <= 7.6e-56)
		tmp = 0.5 * sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	else
		tmp = 0.5 * sqrt(((re * 4.0) + (im_m * (im_m / re))));
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, -1.25e+34], N[(0.5 * N[(im$95$m * N[Sqrt[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 7.6e-56], N[(0.5 * N[Sqrt[N[(im$95$m * N[(2.0 + N[(2.0 * N[(re / im$95$m), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(N[(re * 4.0), $MachinePrecision] + N[(im$95$m * N[(im$95$m / re), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq -1.25 \cdot 10^{+34}:\\
\;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\

\mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\
\;\;\;\;0.5 \cdot \sqrt{im\_m \cdot \left(2 + 2 \cdot \frac{re}{im\_m}\right)}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{re \cdot 4 + im\_m \cdot \frac{im\_m}{re}}\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if re < -1.25e34

    1. Initial program 8.8%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6439.6%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified39.6%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(-1 \cdot \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(0 - \frac{{im}^{2}}{re}\right)\right)\right) \]
      3. --lowering--.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0 - \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      2. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      4. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    9. Applied egg-rr40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{-\frac{im \cdot im}{re}}} \]
    10. Step-by-step derivation
      1. div-invN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\mathsf{neg}\left(\left(im \cdot im\right) \cdot \frac{1}{re}\right)}\right)\right) \]
      2. distribute-rgt-neg-inN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\left(im \cdot im\right) \cdot \left(\mathsf{neg}\left(\frac{1}{re}\right)\right)}\right)\right) \]
      3. sqrt-prodN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{im \cdot im} \cdot \color{blue}{\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      4. pow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{{im}^{2}} \cdot \sqrt{\mathsf{neg}\left(\color{blue}{\frac{1}{re}}\right)}\right)\right) \]
      5. sqrt-pow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{\left(\frac{2}{2}\right)} \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      6. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{1} \cdot \sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)\right) \]
      7. unpow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      8. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \color{blue}{\left(\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)}\right)\right) \]
      9. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      10. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      11. /-lowering-/.f6439.1%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(1, re\right)\right)\right)\right)\right) \]
    11. Applied egg-rr39.1%

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

    if -1.25e34 < re < 7.6000000000000004e-56

    1. Initial program 58.5%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6489.7%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified89.7%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in im around inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(im \cdot \left(2 + 2 \cdot \frac{re}{im}\right)\right)}\right)\right) \]
    6. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \left(2 + 2 \cdot \frac{re}{im}\right)\right)\right)\right) \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \left(2 \cdot \frac{re}{im}\right)\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \mathsf{*.f64}\left(2, \left(\frac{re}{im}\right)\right)\right)\right)\right)\right) \]
      4. /-lowering-/.f6436.5%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \mathsf{*.f64}\left(2, \mathsf{/.f64}\left(re, im\right)\right)\right)\right)\right)\right) \]
    7. Simplified36.5%

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

    if 7.6000000000000004e-56 < re

    1. Initial program 53.4%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in im around 0

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(4 \cdot re + \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\left(4 \cdot re\right), \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. *-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\left(re \cdot 4\right), \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6475.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified75.0%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{re \cdot 4 + \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. associate-/l*N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \left(im \cdot \frac{im}{re}\right)\right)\right)\right) \]
      2. *-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \left(\frac{im}{re} \cdot im\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \mathsf{*.f64}\left(\left(\frac{im}{re}\right), im\right)\right)\right)\right) \]
      4. /-lowering-/.f6481.3%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{+.f64}\left(\mathsf{*.f64}\left(re, 4\right), \mathsf{*.f64}\left(\mathsf{/.f64}\left(im, re\right), im\right)\right)\right)\right) \]
    9. Applied egg-rr81.3%

      \[\leadsto 0.5 \cdot \sqrt{re \cdot 4 + \color{blue}{\frac{im}{re} \cdot im}} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification50.8%

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \leq -1.25 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{im \cdot \left(2 + 2 \cdot \frac{re}{im}\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{re \cdot 4 + im \cdot \frac{im}{re}}\\ \end{array} \]
  5. Add Preprocessing

Alternative 3: 76.2% accurate, 1.8× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq -1.7 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 6 \cdot 10^{-59}:\\ \;\;\;\;0.5 \cdot \sqrt{im\_m \cdot \left(2 + 2 \cdot \frac{re}{im\_m}\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= re -1.7e+34)
   (* 0.5 (* im_m (sqrt (/ -1.0 re))))
   (if (<= re 6e-59)
     (* 0.5 (sqrt (* im_m (+ 2.0 (* 2.0 (/ re im_m))))))
     (sqrt re))))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= -1.7e+34) {
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	} else if (re <= 6e-59) {
		tmp = 0.5 * sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	} else {
		tmp = sqrt(re);
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= (-1.7d+34)) then
        tmp = 0.5d0 * (im_m * sqrt(((-1.0d0) / re)))
    else if (re <= 6d-59) then
        tmp = 0.5d0 * sqrt((im_m * (2.0d0 + (2.0d0 * (re / im_m)))))
    else
        tmp = sqrt(re)
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= -1.7e+34) {
		tmp = 0.5 * (im_m * Math.sqrt((-1.0 / re)));
	} else if (re <= 6e-59) {
		tmp = 0.5 * Math.sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	} else {
		tmp = Math.sqrt(re);
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= -1.7e+34:
		tmp = 0.5 * (im_m * math.sqrt((-1.0 / re)))
	elif re <= 6e-59:
		tmp = 0.5 * math.sqrt((im_m * (2.0 + (2.0 * (re / im_m)))))
	else:
		tmp = math.sqrt(re)
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= -1.7e+34)
		tmp = Float64(0.5 * Float64(im_m * sqrt(Float64(-1.0 / re))));
	elseif (re <= 6e-59)
		tmp = Float64(0.5 * sqrt(Float64(im_m * Float64(2.0 + Float64(2.0 * Float64(re / im_m))))));
	else
		tmp = sqrt(re);
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= -1.7e+34)
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	elseif (re <= 6e-59)
		tmp = 0.5 * sqrt((im_m * (2.0 + (2.0 * (re / im_m)))));
	else
		tmp = sqrt(re);
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, -1.7e+34], N[(0.5 * N[(im$95$m * N[Sqrt[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 6e-59], N[(0.5 * N[Sqrt[N[(im$95$m * N[(2.0 + N[(2.0 * N[(re / im$95$m), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[re], $MachinePrecision]]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq -1.7 \cdot 10^{+34}:\\
\;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\

\mathbf{elif}\;re \leq 6 \cdot 10^{-59}:\\
\;\;\;\;0.5 \cdot \sqrt{im\_m \cdot \left(2 + 2 \cdot \frac{re}{im\_m}\right)}\\

\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if re < -1.7e34

    1. Initial program 8.8%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6439.6%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified39.6%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(-1 \cdot \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(0 - \frac{{im}^{2}}{re}\right)\right)\right) \]
      3. --lowering--.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0 - \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      2. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      4. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    9. Applied egg-rr40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{-\frac{im \cdot im}{re}}} \]
    10. Step-by-step derivation
      1. div-invN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\mathsf{neg}\left(\left(im \cdot im\right) \cdot \frac{1}{re}\right)}\right)\right) \]
      2. distribute-rgt-neg-inN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\left(im \cdot im\right) \cdot \left(\mathsf{neg}\left(\frac{1}{re}\right)\right)}\right)\right) \]
      3. sqrt-prodN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{im \cdot im} \cdot \color{blue}{\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      4. pow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{{im}^{2}} \cdot \sqrt{\mathsf{neg}\left(\color{blue}{\frac{1}{re}}\right)}\right)\right) \]
      5. sqrt-pow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{\left(\frac{2}{2}\right)} \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      6. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{1} \cdot \sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)\right) \]
      7. unpow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      8. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \color{blue}{\left(\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)}\right)\right) \]
      9. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      10. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      11. /-lowering-/.f6439.1%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(1, re\right)\right)\right)\right)\right) \]
    11. Applied egg-rr39.1%

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

    if -1.7e34 < re < 6.0000000000000002e-59

    1. Initial program 58.5%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6489.7%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified89.7%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in im around inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(im \cdot \left(2 + 2 \cdot \frac{re}{im}\right)\right)}\right)\right) \]
    6. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \left(2 + 2 \cdot \frac{re}{im}\right)\right)\right)\right) \]
      2. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \left(2 \cdot \frac{re}{im}\right)\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \mathsf{*.f64}\left(2, \left(\frac{re}{im}\right)\right)\right)\right)\right)\right) \]
      4. /-lowering-/.f6436.5%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, \mathsf{+.f64}\left(2, \mathsf{*.f64}\left(2, \mathsf{/.f64}\left(re, im\right)\right)\right)\right)\right)\right) \]
    7. Simplified36.5%

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

    if 6.0000000000000002e-59 < re

    1. Initial program 53.4%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around inf

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(\sqrt{re} \cdot {\left(\sqrt{2}\right)}^{2}\right)} \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \frac{1}{2} \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \color{blue}{\sqrt{re}}\right) \]
      2. unpow2N/A

        \[\leadsto \frac{1}{2} \cdot \left(\left(\sqrt{2} \cdot \sqrt{2}\right) \cdot \sqrt{\color{blue}{re}}\right) \]
      3. rem-square-sqrtN/A

        \[\leadsto \frac{1}{2} \cdot \left(2 \cdot \sqrt{\color{blue}{re}}\right) \]
      4. associate-*r*N/A

        \[\leadsto \left(\frac{1}{2} \cdot 2\right) \cdot \color{blue}{\sqrt{re}} \]
      5. metadata-evalN/A

        \[\leadsto 1 \cdot \sqrt{\color{blue}{re}} \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(1, \color{blue}{\left(\sqrt{re}\right)}\right) \]
      7. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{*.f64}\left(1, \mathsf{sqrt.f64}\left(re\right)\right) \]
    7. Simplified80.9%

      \[\leadsto \color{blue}{1 \cdot \sqrt{re}} \]
    8. Step-by-step derivation
      1. *-lft-identityN/A

        \[\leadsto \sqrt{re} \]
      2. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{sqrt.f64}\left(re\right) \]
    9. Applied egg-rr80.9%

      \[\leadsto \color{blue}{\sqrt{re}} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification50.6%

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \leq -1.7 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 6 \cdot 10^{-59}:\\ \;\;\;\;0.5 \cdot \sqrt{im \cdot \left(2 + 2 \cdot \frac{re}{im}\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \]
  5. Add Preprocessing

Alternative 4: 76.2% accurate, 1.8× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq -8.2 \cdot 10^{+33}:\\ \;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 7 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\_m\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= re -8.2e+33)
   (* 0.5 (* im_m (sqrt (/ -1.0 re))))
   (if (<= re 7e-56) (* 0.5 (sqrt (* 2.0 (+ re im_m)))) (sqrt re))))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= -8.2e+33) {
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	} else if (re <= 7e-56) {
		tmp = 0.5 * sqrt((2.0 * (re + im_m)));
	} else {
		tmp = sqrt(re);
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= (-8.2d+33)) then
        tmp = 0.5d0 * (im_m * sqrt(((-1.0d0) / re)))
    else if (re <= 7d-56) then
        tmp = 0.5d0 * sqrt((2.0d0 * (re + im_m)))
    else
        tmp = sqrt(re)
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= -8.2e+33) {
		tmp = 0.5 * (im_m * Math.sqrt((-1.0 / re)));
	} else if (re <= 7e-56) {
		tmp = 0.5 * Math.sqrt((2.0 * (re + im_m)));
	} else {
		tmp = Math.sqrt(re);
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= -8.2e+33:
		tmp = 0.5 * (im_m * math.sqrt((-1.0 / re)))
	elif re <= 7e-56:
		tmp = 0.5 * math.sqrt((2.0 * (re + im_m)))
	else:
		tmp = math.sqrt(re)
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= -8.2e+33)
		tmp = Float64(0.5 * Float64(im_m * sqrt(Float64(-1.0 / re))));
	elseif (re <= 7e-56)
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + im_m))));
	else
		tmp = sqrt(re);
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= -8.2e+33)
		tmp = 0.5 * (im_m * sqrt((-1.0 / re)));
	elseif (re <= 7e-56)
		tmp = 0.5 * sqrt((2.0 * (re + im_m)));
	else
		tmp = sqrt(re);
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, -8.2e+33], N[(0.5 * N[(im$95$m * N[Sqrt[N[(-1.0 / re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 7e-56], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + im$95$m), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[re], $MachinePrecision]]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq -8.2 \cdot 10^{+33}:\\
\;\;\;\;0.5 \cdot \left(im\_m \cdot \sqrt{\frac{-1}{re}}\right)\\

\mathbf{elif}\;re \leq 7 \cdot 10^{-56}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\_m\right)}\\

\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if re < -8.1999999999999999e33

    1. Initial program 8.8%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6439.6%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified39.6%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(-1 \cdot \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(0 - \frac{{im}^{2}}{re}\right)\right)\right) \]
      3. --lowering--.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0 - \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      2. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      4. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    9. Applied egg-rr40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{-\frac{im \cdot im}{re}}} \]
    10. Step-by-step derivation
      1. div-invN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\mathsf{neg}\left(\left(im \cdot im\right) \cdot \frac{1}{re}\right)}\right)\right) \]
      2. distribute-rgt-neg-inN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{\left(im \cdot im\right) \cdot \left(\mathsf{neg}\left(\frac{1}{re}\right)\right)}\right)\right) \]
      3. sqrt-prodN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{im \cdot im} \cdot \color{blue}{\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      4. pow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(\sqrt{{im}^{2}} \cdot \sqrt{\mathsf{neg}\left(\color{blue}{\frac{1}{re}}\right)}\right)\right) \]
      5. sqrt-pow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{\left(\frac{2}{2}\right)} \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      6. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{1} \cdot \sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)\right) \]
      7. unpow1N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot \sqrt{\color{blue}{\mathsf{neg}\left(\frac{1}{re}\right)}}\right)\right) \]
      8. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \color{blue}{\left(\sqrt{\mathsf{neg}\left(\frac{1}{re}\right)}\right)}\right)\right) \]
      9. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      10. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{1}{re}\right)\right)\right)\right)\right) \]
      11. /-lowering-/.f6439.1%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(1, re\right)\right)\right)\right)\right) \]
    11. Applied egg-rr39.1%

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

    if -8.1999999999999999e33 < re < 6.9999999999999996e-56

    1. Initial program 58.5%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6489.7%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified89.7%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around 0

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(2 \cdot im + 2 \cdot re\right)}\right)\right) \]
    6. Step-by-step derivation
      1. distribute-lft-outN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(im + re\right)\right)\right)\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(im + re\right)\right)\right)\right) \]
      3. +-lowering-+.f6436.5%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(im, re\right)\right)\right)\right) \]
    7. Simplified36.5%

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

    if 6.9999999999999996e-56 < re

    1. Initial program 53.4%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around inf

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(\sqrt{re} \cdot {\left(\sqrt{2}\right)}^{2}\right)} \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \frac{1}{2} \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \color{blue}{\sqrt{re}}\right) \]
      2. unpow2N/A

        \[\leadsto \frac{1}{2} \cdot \left(\left(\sqrt{2} \cdot \sqrt{2}\right) \cdot \sqrt{\color{blue}{re}}\right) \]
      3. rem-square-sqrtN/A

        \[\leadsto \frac{1}{2} \cdot \left(2 \cdot \sqrt{\color{blue}{re}}\right) \]
      4. associate-*r*N/A

        \[\leadsto \left(\frac{1}{2} \cdot 2\right) \cdot \color{blue}{\sqrt{re}} \]
      5. metadata-evalN/A

        \[\leadsto 1 \cdot \sqrt{\color{blue}{re}} \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(1, \color{blue}{\left(\sqrt{re}\right)}\right) \]
      7. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{*.f64}\left(1, \mathsf{sqrt.f64}\left(re\right)\right) \]
    7. Simplified80.9%

      \[\leadsto \color{blue}{1 \cdot \sqrt{re}} \]
    8. Step-by-step derivation
      1. *-lft-identityN/A

        \[\leadsto \sqrt{re} \]
      2. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{sqrt.f64}\left(re\right) \]
    9. Applied egg-rr80.9%

      \[\leadsto \color{blue}{\sqrt{re}} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification50.6%

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \leq -8.2 \cdot 10^{+33}:\\ \;\;\;\;0.5 \cdot \left(im \cdot \sqrt{\frac{-1}{re}}\right)\\ \mathbf{elif}\;re \leq 7 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \]
  5. Add Preprocessing

Alternative 5: 76.2% accurate, 1.8× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq -2.3 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \frac{im\_m}{\sqrt{0 - re}}\\ \mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\_m\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= re -2.3e+34)
   (* 0.5 (/ im_m (sqrt (- 0.0 re))))
   (if (<= re 7.6e-56) (* 0.5 (sqrt (* 2.0 (+ re im_m)))) (sqrt re))))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= -2.3e+34) {
		tmp = 0.5 * (im_m / sqrt((0.0 - re)));
	} else if (re <= 7.6e-56) {
		tmp = 0.5 * sqrt((2.0 * (re + im_m)));
	} else {
		tmp = sqrt(re);
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= (-2.3d+34)) then
        tmp = 0.5d0 * (im_m / sqrt((0.0d0 - re)))
    else if (re <= 7.6d-56) then
        tmp = 0.5d0 * sqrt((2.0d0 * (re + im_m)))
    else
        tmp = sqrt(re)
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= -2.3e+34) {
		tmp = 0.5 * (im_m / Math.sqrt((0.0 - re)));
	} else if (re <= 7.6e-56) {
		tmp = 0.5 * Math.sqrt((2.0 * (re + im_m)));
	} else {
		tmp = Math.sqrt(re);
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= -2.3e+34:
		tmp = 0.5 * (im_m / math.sqrt((0.0 - re)))
	elif re <= 7.6e-56:
		tmp = 0.5 * math.sqrt((2.0 * (re + im_m)))
	else:
		tmp = math.sqrt(re)
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= -2.3e+34)
		tmp = Float64(0.5 * Float64(im_m / sqrt(Float64(0.0 - re))));
	elseif (re <= 7.6e-56)
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + im_m))));
	else
		tmp = sqrt(re);
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= -2.3e+34)
		tmp = 0.5 * (im_m / sqrt((0.0 - re)));
	elseif (re <= 7.6e-56)
		tmp = 0.5 * sqrt((2.0 * (re + im_m)));
	else
		tmp = sqrt(re);
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, -2.3e+34], N[(0.5 * N[(im$95$m / N[Sqrt[N[(0.0 - re), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[re, 7.6e-56], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + im$95$m), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[re], $MachinePrecision]]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq -2.3 \cdot 10^{+34}:\\
\;\;\;\;0.5 \cdot \frac{im\_m}{\sqrt{0 - re}}\\

\mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\_m\right)}\\

\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\


\end{array}
\end{array}
Derivation
  1. Split input into 3 regimes
  2. if re < -2.2999999999999998e34

    1. Initial program 8.8%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6439.6%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified39.6%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(-1 \cdot \frac{{im}^{2}}{re}\right)}\right)\right) \]
    6. Step-by-step derivation
      1. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      2. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(0 - \frac{{im}^{2}}{re}\right)\right)\right) \]
      3. --lowering--.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \left(\frac{{im}^{2}}{re}\right)\right)\right)\right) \]
      4. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left({im}^{2}\right), re\right)\right)\right)\right) \]
      5. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      6. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, \mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    7. Simplified40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0 - \frac{im \cdot im}{re}}} \]
    8. Step-by-step derivation
      1. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(\mathsf{neg}\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      2. neg-lowering-neg.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\left(\frac{im \cdot im}{re}\right)\right)\right)\right) \]
      3. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\left(im \cdot im\right), re\right)\right)\right)\right) \]
      4. *-lowering-*.f6440.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{neg.f64}\left(\mathsf{/.f64}\left(\mathsf{*.f64}\left(im, im\right), re\right)\right)\right)\right) \]
    9. Applied egg-rr40.9%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{-\frac{im \cdot im}{re}}} \]
    10. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \sqrt{\mathsf{neg}\left(\frac{im \cdot im}{re}\right)} \cdot \color{blue}{\frac{1}{2}} \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\left(\sqrt{\mathsf{neg}\left(\frac{im \cdot im}{re}\right)}\right), \color{blue}{\frac{1}{2}}\right) \]
      3. distribute-neg-frac2N/A

        \[\leadsto \mathsf{*.f64}\left(\left(\sqrt{\frac{im \cdot im}{\mathsf{neg}\left(re\right)}}\right), \frac{1}{2}\right) \]
      4. sub0-negN/A

        \[\leadsto \mathsf{*.f64}\left(\left(\sqrt{\frac{im \cdot im}{0 - re}}\right), \frac{1}{2}\right) \]
      5. sqrt-divN/A

        \[\leadsto \mathsf{*.f64}\left(\left(\frac{\sqrt{im \cdot im}}{\sqrt{0 - re}}\right), \frac{1}{2}\right) \]
      6. pow2N/A

        \[\leadsto \mathsf{*.f64}\left(\left(\frac{\sqrt{{im}^{2}}}{\sqrt{0 - re}}\right), \frac{1}{2}\right) \]
      7. sqrt-pow1N/A

        \[\leadsto \mathsf{*.f64}\left(\left(\frac{{im}^{\left(\frac{2}{2}\right)}}{\sqrt{0 - re}}\right), \frac{1}{2}\right) \]
      8. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\left(\frac{{im}^{1}}{\sqrt{0 - re}}\right), \frac{1}{2}\right) \]
      9. unpow1N/A

        \[\leadsto \mathsf{*.f64}\left(\left(\frac{im}{\sqrt{0 - re}}\right), \frac{1}{2}\right) \]
      10. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\mathsf{/.f64}\left(im, \left(\sqrt{0 - re}\right)\right), \frac{1}{2}\right) \]
      11. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\mathsf{/.f64}\left(im, \mathsf{sqrt.f64}\left(\left(0 - re\right)\right)\right), \frac{1}{2}\right) \]
      12. --lowering--.f6439.1%

        \[\leadsto \mathsf{*.f64}\left(\mathsf{/.f64}\left(im, \mathsf{sqrt.f64}\left(\mathsf{\_.f64}\left(0, re\right)\right)\right), \frac{1}{2}\right) \]
    11. Applied egg-rr39.1%

      \[\leadsto \color{blue}{\frac{im}{\sqrt{0 - re}} \cdot 0.5} \]

    if -2.2999999999999998e34 < re < 7.6000000000000004e-56

    1. Initial program 58.5%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6489.7%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified89.7%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around 0

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(2 \cdot im + 2 \cdot re\right)}\right)\right) \]
    6. Step-by-step derivation
      1. distribute-lft-outN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(im + re\right)\right)\right)\right) \]
      2. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(im + re\right)\right)\right)\right) \]
      3. +-lowering-+.f6436.5%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(im, re\right)\right)\right)\right) \]
    7. Simplified36.5%

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

    if 7.6000000000000004e-56 < re

    1. Initial program 53.4%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around inf

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(\sqrt{re} \cdot {\left(\sqrt{2}\right)}^{2}\right)} \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \frac{1}{2} \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \color{blue}{\sqrt{re}}\right) \]
      2. unpow2N/A

        \[\leadsto \frac{1}{2} \cdot \left(\left(\sqrt{2} \cdot \sqrt{2}\right) \cdot \sqrt{\color{blue}{re}}\right) \]
      3. rem-square-sqrtN/A

        \[\leadsto \frac{1}{2} \cdot \left(2 \cdot \sqrt{\color{blue}{re}}\right) \]
      4. associate-*r*N/A

        \[\leadsto \left(\frac{1}{2} \cdot 2\right) \cdot \color{blue}{\sqrt{re}} \]
      5. metadata-evalN/A

        \[\leadsto 1 \cdot \sqrt{\color{blue}{re}} \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(1, \color{blue}{\left(\sqrt{re}\right)}\right) \]
      7. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{*.f64}\left(1, \mathsf{sqrt.f64}\left(re\right)\right) \]
    7. Simplified80.9%

      \[\leadsto \color{blue}{1 \cdot \sqrt{re}} \]
    8. Step-by-step derivation
      1. *-lft-identityN/A

        \[\leadsto \sqrt{re} \]
      2. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{sqrt.f64}\left(re\right) \]
    9. Applied egg-rr80.9%

      \[\leadsto \color{blue}{\sqrt{re}} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification50.6%

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \leq -2.3 \cdot 10^{+34}:\\ \;\;\;\;0.5 \cdot \frac{im}{\sqrt{0 - re}}\\ \mathbf{elif}\;re \leq 7.6 \cdot 10^{-56}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \]
  5. Add Preprocessing

Alternative 6: 64.0% accurate, 1.9× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq 4.4 \cdot 10^{-62}:\\ \;\;\;\;0.5 \cdot \sqrt{im\_m \cdot 2}\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m)
 :precision binary64
 (if (<= re 4.4e-62) (* 0.5 (sqrt (* im_m 2.0))) (sqrt re)))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= 4.4e-62) {
		tmp = 0.5 * sqrt((im_m * 2.0));
	} else {
		tmp = sqrt(re);
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= 4.4d-62) then
        tmp = 0.5d0 * sqrt((im_m * 2.0d0))
    else
        tmp = sqrt(re)
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= 4.4e-62) {
		tmp = 0.5 * Math.sqrt((im_m * 2.0));
	} else {
		tmp = Math.sqrt(re);
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= 4.4e-62:
		tmp = 0.5 * math.sqrt((im_m * 2.0))
	else:
		tmp = math.sqrt(re)
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= 4.4e-62)
		tmp = Float64(0.5 * sqrt(Float64(im_m * 2.0)));
	else
		tmp = sqrt(re);
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= 4.4e-62)
		tmp = 0.5 * sqrt((im_m * 2.0));
	else
		tmp = sqrt(re);
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, 4.4e-62], N[(0.5 * N[Sqrt[N[(im$95$m * 2.0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], N[Sqrt[re], $MachinePrecision]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq 4.4 \cdot 10^{-62}:\\
\;\;\;\;0.5 \cdot \sqrt{im\_m \cdot 2}\\

\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if re < 4.40000000000000035e-62

    1. Initial program 42.6%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f6473.7%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified73.7%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around 0

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(2 \cdot im\right)}\right)\right) \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(im \cdot 2\right)\right)\right) \]
      2. *-lowering-*.f6429.4%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(im, 2\right)\right)\right) \]
    7. Simplified29.4%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{im \cdot 2}} \]

    if 4.40000000000000035e-62 < re

    1. Initial program 53.4%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around inf

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(\sqrt{re} \cdot {\left(\sqrt{2}\right)}^{2}\right)} \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \frac{1}{2} \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \color{blue}{\sqrt{re}}\right) \]
      2. unpow2N/A

        \[\leadsto \frac{1}{2} \cdot \left(\left(\sqrt{2} \cdot \sqrt{2}\right) \cdot \sqrt{\color{blue}{re}}\right) \]
      3. rem-square-sqrtN/A

        \[\leadsto \frac{1}{2} \cdot \left(2 \cdot \sqrt{\color{blue}{re}}\right) \]
      4. associate-*r*N/A

        \[\leadsto \left(\frac{1}{2} \cdot 2\right) \cdot \color{blue}{\sqrt{re}} \]
      5. metadata-evalN/A

        \[\leadsto 1 \cdot \sqrt{\color{blue}{re}} \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(1, \color{blue}{\left(\sqrt{re}\right)}\right) \]
      7. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{*.f64}\left(1, \mathsf{sqrt.f64}\left(re\right)\right) \]
    7. Simplified80.9%

      \[\leadsto \color{blue}{1 \cdot \sqrt{re}} \]
    8. Step-by-step derivation
      1. *-lft-identityN/A

        \[\leadsto \sqrt{re} \]
      2. sqrt-lowering-sqrt.f6480.9%

        \[\leadsto \mathsf{sqrt.f64}\left(re\right) \]
    9. Applied egg-rr80.9%

      \[\leadsto \color{blue}{\sqrt{re}} \]
  3. Recombined 2 regimes into one program.
  4. Add Preprocessing

Alternative 7: 31.1% accurate, 2.0× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ \begin{array}{l} \mathbf{if}\;re \leq -2 \cdot 10^{-310}:\\ \;\;\;\;0\\ \mathbf{else}:\\ \;\;\;\;\sqrt{re}\\ \end{array} \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m) :precision binary64 (if (<= re -2e-310) 0.0 (sqrt re)))
im_m = fabs(im);
double code(double re, double im_m) {
	double tmp;
	if (re <= -2e-310) {
		tmp = 0.0;
	} else {
		tmp = sqrt(re);
	}
	return tmp;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    real(8) :: tmp
    if (re <= (-2d-310)) then
        tmp = 0.0d0
    else
        tmp = sqrt(re)
    end if
    code = tmp
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	double tmp;
	if (re <= -2e-310) {
		tmp = 0.0;
	} else {
		tmp = Math.sqrt(re);
	}
	return tmp;
}
im_m = math.fabs(im)
def code(re, im_m):
	tmp = 0
	if re <= -2e-310:
		tmp = 0.0
	else:
		tmp = math.sqrt(re)
	return tmp
im_m = abs(im)
function code(re, im_m)
	tmp = 0.0
	if (re <= -2e-310)
		tmp = 0.0;
	else
		tmp = sqrt(re);
	end
	return tmp
end
im_m = abs(im);
function tmp_2 = code(re, im_m)
	tmp = 0.0;
	if (re <= -2e-310)
		tmp = 0.0;
	else
		tmp = sqrt(re);
	end
	tmp_2 = tmp;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := If[LessEqual[re, -2e-310], 0.0, N[Sqrt[re], $MachinePrecision]]
\begin{array}{l}
im_m = \left|im\right|

\\
\begin{array}{l}
\mathbf{if}\;re \leq -2 \cdot 10^{-310}:\\
\;\;\;\;0\\

\mathbf{else}:\\
\;\;\;\;\sqrt{re}\\


\end{array}
\end{array}
Derivation
  1. Split input into 2 regimes
  2. if re < -1.999999999999994e-310

    1. Initial program 34.6%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Add Preprocessing
    3. Taylor expanded in re around -inf

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\color{blue}{\left(-1 \cdot \left(re \cdot \left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right)\right)}, re\right)\right)\right)\right) \]
    4. Step-by-step derivation
      1. associate-*r*N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\left(\left(-1 \cdot re\right) \cdot \left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right), re\right)\right)\right)\right) \]
      2. *-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\left(\left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right) \cdot \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      4. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      5. associate-*r/N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \left(\frac{\frac{1}{2} \cdot {im}^{2}}{{re}^{2}}\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      6. /-lowering-/.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\left(\frac{1}{2} \cdot {im}^{2}\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      7. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{2}\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      8. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot im\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      9. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      10. unpow2N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \left(re \cdot re\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      11. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
      12. mul-1-negN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(\mathsf{neg}\left(re\right)\right)\right), re\right)\right)\right)\right) \]
      13. neg-sub0N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(0 - re\right)\right), re\right)\right)\right)\right) \]
      14. --lowering--.f647.9%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \mathsf{\_.f64}\left(0, re\right)\right), re\right)\right)\right)\right) \]
    5. Simplified7.9%

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\left(1 + \frac{0.5 \cdot \left(im \cdot im\right)}{re \cdot re}\right) \cdot \left(0 - re\right)} + re\right)} \]
    6. Taylor expanded in im around 0

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(2 \cdot \left(re + -1 \cdot re\right)\right)}\right)\right) \]
    7. Step-by-step derivation
      1. distribute-rgt1-inN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\left(-1 + 1\right) \cdot re\right)\right)\right)\right) \]
      2. metadata-evalN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(0 \cdot re\right)\right)\right)\right) \]
      3. mul0-lftN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot 0\right)\right)\right) \]
      4. metadata-eval6.6%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(0\right)\right) \]
    8. Simplified6.6%

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0}} \]
    9. Step-by-step derivation
      1. pow1/2N/A

        \[\leadsto \frac{1}{2} \cdot {0}^{\color{blue}{\frac{1}{2}}} \]
      2. metadata-evalN/A

        \[\leadsto \frac{1}{2} \cdot 0 \]
      3. metadata-eval6.6%

        \[\leadsto 0 \]
    10. Applied egg-rr6.6%

      \[\leadsto \color{blue}{0} \]

    if -1.999999999999994e-310 < re

    1. Initial program 56.3%

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Step-by-step derivation
      1. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \color{blue}{\left(\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\right)}\right) \]
      2. sqrt-lowering-sqrt.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      3. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(\sqrt{re \cdot re + im \cdot im} + re\right)\right)\right)\right) \]
      4. +-commutativeN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \left(re + \sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right) \]
      5. +-lowering-+.f64N/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\sqrt{re \cdot re + im \cdot im}\right)\right)\right)\right)\right) \]
      6. hypot-defineN/A

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \left(\mathsf{hypot}\left(re, im\right)\right)\right)\right)\right)\right) \]
      7. hypot-lowering-hypot.f64100.0%

        \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(re, \mathsf{hypot.f64}\left(re, im\right)\right)\right)\right)\right) \]
    3. Simplified100.0%

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)}} \]
    4. Add Preprocessing
    5. Taylor expanded in re around inf

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left(\sqrt{re} \cdot {\left(\sqrt{2}\right)}^{2}\right)} \]
    6. Step-by-step derivation
      1. *-commutativeN/A

        \[\leadsto \frac{1}{2} \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \color{blue}{\sqrt{re}}\right) \]
      2. unpow2N/A

        \[\leadsto \frac{1}{2} \cdot \left(\left(\sqrt{2} \cdot \sqrt{2}\right) \cdot \sqrt{\color{blue}{re}}\right) \]
      3. rem-square-sqrtN/A

        \[\leadsto \frac{1}{2} \cdot \left(2 \cdot \sqrt{\color{blue}{re}}\right) \]
      4. associate-*r*N/A

        \[\leadsto \left(\frac{1}{2} \cdot 2\right) \cdot \color{blue}{\sqrt{re}} \]
      5. metadata-evalN/A

        \[\leadsto 1 \cdot \sqrt{\color{blue}{re}} \]
      6. *-lowering-*.f64N/A

        \[\leadsto \mathsf{*.f64}\left(1, \color{blue}{\left(\sqrt{re}\right)}\right) \]
      7. sqrt-lowering-sqrt.f6457.5%

        \[\leadsto \mathsf{*.f64}\left(1, \mathsf{sqrt.f64}\left(re\right)\right) \]
    7. Simplified57.5%

      \[\leadsto \color{blue}{1 \cdot \sqrt{re}} \]
    8. Step-by-step derivation
      1. *-lft-identityN/A

        \[\leadsto \sqrt{re} \]
      2. sqrt-lowering-sqrt.f6457.5%

        \[\leadsto \mathsf{sqrt.f64}\left(re\right) \]
    9. Applied egg-rr57.5%

      \[\leadsto \color{blue}{\sqrt{re}} \]
  3. Recombined 2 regimes into one program.
  4. Add Preprocessing

Alternative 8: 6.1% accurate, 213.0× speedup?

\[\begin{array}{l} im_m = \left|im\right| \\ 0 \end{array} \]
im_m = (fabs.f64 im)
(FPCore (re im_m) :precision binary64 0.0)
im_m = fabs(im);
double code(double re, double im_m) {
	return 0.0;
}
im_m = abs(im)
real(8) function code(re, im_m)
    real(8), intent (in) :: re
    real(8), intent (in) :: im_m
    code = 0.0d0
end function
im_m = Math.abs(im);
public static double code(double re, double im_m) {
	return 0.0;
}
im_m = math.fabs(im)
def code(re, im_m):
	return 0.0
im_m = abs(im)
function code(re, im_m)
	return 0.0
end
im_m = abs(im);
function tmp = code(re, im_m)
	tmp = 0.0;
end
im_m = N[Abs[im], $MachinePrecision]
code[re_, im$95$m_] := 0.0
\begin{array}{l}
im_m = \left|im\right|

\\
0
\end{array}
Derivation
  1. Initial program 45.9%

    \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
  2. Add Preprocessing
  3. Taylor expanded in re around -inf

    \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\color{blue}{\left(-1 \cdot \left(re \cdot \left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right)\right)}, re\right)\right)\right)\right) \]
  4. Step-by-step derivation
    1. associate-*r*N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\left(\left(-1 \cdot re\right) \cdot \left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right), re\right)\right)\right)\right) \]
    2. *-commutativeN/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\left(\left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right) \cdot \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    3. *-lowering-*.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\left(1 + \frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    4. +-lowering-+.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \left(\frac{1}{2} \cdot \frac{{im}^{2}}{{re}^{2}}\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    5. associate-*r/N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \left(\frac{\frac{1}{2} \cdot {im}^{2}}{{re}^{2}}\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    6. /-lowering-/.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\left(\frac{1}{2} \cdot {im}^{2}\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    7. *-lowering-*.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \left({im}^{2}\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    8. unpow2N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \left(im \cdot im\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    9. *-lowering-*.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \left({re}^{2}\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    10. unpow2N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \left(re \cdot re\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    11. *-lowering-*.f64N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(-1 \cdot re\right)\right), re\right)\right)\right)\right) \]
    12. mul-1-negN/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(\mathsf{neg}\left(re\right)\right)\right), re\right)\right)\right)\right) \]
    13. neg-sub0N/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \left(0 - re\right)\right), re\right)\right)\right)\right) \]
    14. --lowering--.f644.5%

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\mathsf{*.f64}\left(2, \mathsf{+.f64}\left(\mathsf{*.f64}\left(\mathsf{+.f64}\left(1, \mathsf{/.f64}\left(\mathsf{*.f64}\left(\frac{1}{2}, \mathsf{*.f64}\left(im, im\right)\right), \mathsf{*.f64}\left(re, re\right)\right)\right), \mathsf{\_.f64}\left(0, re\right)\right), re\right)\right)\right)\right) \]
  5. Simplified4.5%

    \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\left(1 + \frac{0.5 \cdot \left(im \cdot im\right)}{re \cdot re}\right) \cdot \left(0 - re\right)} + re\right)} \]
  6. Taylor expanded in im around 0

    \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\color{blue}{\left(2 \cdot \left(re + -1 \cdot re\right)\right)}\right)\right) \]
  7. Step-by-step derivation
    1. distribute-rgt1-inN/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(\left(-1 + 1\right) \cdot re\right)\right)\right)\right) \]
    2. metadata-evalN/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot \left(0 \cdot re\right)\right)\right)\right) \]
    3. mul0-lftN/A

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(\left(2 \cdot 0\right)\right)\right) \]
    4. metadata-eval4.7%

      \[\leadsto \mathsf{*.f64}\left(\frac{1}{2}, \mathsf{sqrt.f64}\left(0\right)\right) \]
  8. Simplified4.7%

    \[\leadsto 0.5 \cdot \sqrt{\color{blue}{0}} \]
  9. Step-by-step derivation
    1. pow1/2N/A

      \[\leadsto \frac{1}{2} \cdot {0}^{\color{blue}{\frac{1}{2}}} \]
    2. metadata-evalN/A

      \[\leadsto \frac{1}{2} \cdot 0 \]
    3. metadata-eval4.7%

      \[\leadsto 0 \]
  10. Applied egg-rr4.7%

    \[\leadsto \color{blue}{0} \]
  11. Add Preprocessing

Developer Target 1: 48.1% accurate, 0.7× speedup?

\[\begin{array}{l} \\ \begin{array}{l} t_0 := \sqrt{re \cdot re + im \cdot im}\\ \mathbf{if}\;re < 0:\\ \;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{t\_0 - re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(t\_0 + re\right)}\\ \end{array} \end{array} \]
(FPCore (re im)
 :precision binary64
 (let* ((t_0 (sqrt (+ (* re re) (* im im)))))
   (if (< re 0.0)
     (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- t_0 re)))))
     (* 0.5 (sqrt (* 2.0 (+ t_0 re)))))))
double code(double re, double im) {
	double t_0 = sqrt(((re * re) + (im * im)));
	double tmp;
	if (re < 0.0) {
		tmp = 0.5 * (sqrt(2.0) * sqrt(((im * im) / (t_0 - re))));
	} else {
		tmp = 0.5 * sqrt((2.0 * (t_0 + re)));
	}
	return tmp;
}
real(8) function code(re, im)
    real(8), intent (in) :: re
    real(8), intent (in) :: im
    real(8) :: t_0
    real(8) :: tmp
    t_0 = sqrt(((re * re) + (im * im)))
    if (re < 0.0d0) then
        tmp = 0.5d0 * (sqrt(2.0d0) * sqrt(((im * im) / (t_0 - re))))
    else
        tmp = 0.5d0 * sqrt((2.0d0 * (t_0 + re)))
    end if
    code = tmp
end function
public static double code(double re, double im) {
	double t_0 = Math.sqrt(((re * re) + (im * im)));
	double tmp;
	if (re < 0.0) {
		tmp = 0.5 * (Math.sqrt(2.0) * Math.sqrt(((im * im) / (t_0 - re))));
	} else {
		tmp = 0.5 * Math.sqrt((2.0 * (t_0 + re)));
	}
	return tmp;
}
def code(re, im):
	t_0 = math.sqrt(((re * re) + (im * im)))
	tmp = 0
	if re < 0.0:
		tmp = 0.5 * (math.sqrt(2.0) * math.sqrt(((im * im) / (t_0 - re))))
	else:
		tmp = 0.5 * math.sqrt((2.0 * (t_0 + re)))
	return tmp
function code(re, im)
	t_0 = sqrt(Float64(Float64(re * re) + Float64(im * im)))
	tmp = 0.0
	if (re < 0.0)
		tmp = Float64(0.5 * Float64(sqrt(2.0) * sqrt(Float64(Float64(im * im) / Float64(t_0 - re)))));
	else
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(t_0 + re))));
	end
	return tmp
end
function tmp_2 = code(re, im)
	t_0 = sqrt(((re * re) + (im * im)));
	tmp = 0.0;
	if (re < 0.0)
		tmp = 0.5 * (sqrt(2.0) * sqrt(((im * im) / (t_0 - re))));
	else
		tmp = 0.5 * sqrt((2.0 * (t_0 + re)));
	end
	tmp_2 = tmp;
end
code[re_, im_] := Block[{t$95$0 = N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]}, If[Less[re, 0.0], N[(0.5 * N[(N[Sqrt[2.0], $MachinePrecision] * N[Sqrt[N[(N[(im * im), $MachinePrecision] / N[(t$95$0 - re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(0.5 * N[Sqrt[N[(2.0 * N[(t$95$0 + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}

\\
\begin{array}{l}
t_0 := \sqrt{re \cdot re + im \cdot im}\\
\mathbf{if}\;re < 0:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{t\_0 - re}}\right)\\

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


\end{array}
\end{array}

Reproduce

?
herbie shell --seed 2024138 
(FPCore (re im)
  :name "math.sqrt on complex, real part"
  :precision binary64

  :alt
  (! :herbie-platform default (if (< re 0) (* 1/2 (* (sqrt 2) (sqrt (/ (* im im) (- (modulus re im) re))))) (* 1/2 (sqrt (* 2 (+ (modulus re im) re))))))

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