?

Average Error: 38.3 → 24.2
Time: 11.0s
Precision: binary64
Cost: 14292

?

\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
\[\begin{array}{l} t_0 := 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{if}\;im \leq -5.6 \cdot 10^{+53}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(-im\right) + re\right)}\\ \mathbf{elif}\;im \leq -1.2 \cdot 10^{-158}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;im \leq -3.8 \cdot 10^{-188}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-im\right)}\\ \mathbf{elif}\;im \leq -2.6 \cdot 10^{-301}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\ \mathbf{elif}\;im \leq 5.2 \cdot 10^{-30}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \end{array} \]
(FPCore (re im)
 :precision binary64
 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
 :precision binary64
 (let* ((t_0 (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))))))
   (if (<= im -5.6e+53)
     (* 0.5 (sqrt (* 2.0 (+ (- im) re))))
     (if (<= im -1.2e-158)
       t_0
       (if (<= im -3.8e-188)
         (* 0.5 (sqrt (* 2.0 (- im))))
         (if (<= im -2.6e-301)
           (* 0.5 (sqrt (* 2.0 (+ re re))))
           (if (<= im 5.2e-30) t_0 (* 0.5 (sqrt (* 2.0 (+ re im)))))))))))
double code(double re, double im) {
	return 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
}
double code(double re, double im) {
	double t_0 = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
	double tmp;
	if (im <= -5.6e+53) {
		tmp = 0.5 * sqrt((2.0 * (-im + re)));
	} else if (im <= -1.2e-158) {
		tmp = t_0;
	} else if (im <= -3.8e-188) {
		tmp = 0.5 * sqrt((2.0 * -im));
	} else if (im <= -2.6e-301) {
		tmp = 0.5 * sqrt((2.0 * (re + re)));
	} else if (im <= 5.2e-30) {
		tmp = t_0;
	} else {
		tmp = 0.5 * sqrt((2.0 * (re + im)));
	}
	return tmp;
}
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
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 = 0.5d0 * sqrt((2.0d0 * (sqrt(((re * re) + (im * im))) + re)))
    if (im <= (-5.6d+53)) then
        tmp = 0.5d0 * sqrt((2.0d0 * (-im + re)))
    else if (im <= (-1.2d-158)) then
        tmp = t_0
    else if (im <= (-3.8d-188)) then
        tmp = 0.5d0 * sqrt((2.0d0 * -im))
    else if (im <= (-2.6d-301)) then
        tmp = 0.5d0 * sqrt((2.0d0 * (re + re)))
    else if (im <= 5.2d-30) then
        tmp = t_0
    else
        tmp = 0.5d0 * sqrt((2.0d0 * (re + im)))
    end if
    code = tmp
end function
public static double code(double re, double im) {
	return 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
}
public static double code(double re, double im) {
	double t_0 = 0.5 * Math.sqrt((2.0 * (Math.sqrt(((re * re) + (im * im))) + re)));
	double tmp;
	if (im <= -5.6e+53) {
		tmp = 0.5 * Math.sqrt((2.0 * (-im + re)));
	} else if (im <= -1.2e-158) {
		tmp = t_0;
	} else if (im <= -3.8e-188) {
		tmp = 0.5 * Math.sqrt((2.0 * -im));
	} else if (im <= -2.6e-301) {
		tmp = 0.5 * Math.sqrt((2.0 * (re + re)));
	} else if (im <= 5.2e-30) {
		tmp = t_0;
	} else {
		tmp = 0.5 * Math.sqrt((2.0 * (re + im)));
	}
	return tmp;
}
def code(re, im):
	return 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
def code(re, im):
	t_0 = 0.5 * math.sqrt((2.0 * (math.sqrt(((re * re) + (im * im))) + re)))
	tmp = 0
	if im <= -5.6e+53:
		tmp = 0.5 * math.sqrt((2.0 * (-im + re)))
	elif im <= -1.2e-158:
		tmp = t_0
	elif im <= -3.8e-188:
		tmp = 0.5 * math.sqrt((2.0 * -im))
	elif im <= -2.6e-301:
		tmp = 0.5 * math.sqrt((2.0 * (re + re)))
	elif im <= 5.2e-30:
		tmp = t_0
	else:
		tmp = 0.5 * math.sqrt((2.0 * (re + im)))
	return tmp
function code(re, im)
	return Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re))))
end
function code(re, im)
	t_0 = Float64(0.5 * sqrt(Float64(2.0 * Float64(sqrt(Float64(Float64(re * re) + Float64(im * im))) + re))))
	tmp = 0.0
	if (im <= -5.6e+53)
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(Float64(-im) + re))));
	elseif (im <= -1.2e-158)
		tmp = t_0;
	elseif (im <= -3.8e-188)
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(-im))));
	elseif (im <= -2.6e-301)
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + re))));
	elseif (im <= 5.2e-30)
		tmp = t_0;
	else
		tmp = Float64(0.5 * sqrt(Float64(2.0 * Float64(re + im))));
	end
	return tmp
end
function tmp = code(re, im)
	tmp = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
end
function tmp_2 = code(re, im)
	t_0 = 0.5 * sqrt((2.0 * (sqrt(((re * re) + (im * im))) + re)));
	tmp = 0.0;
	if (im <= -5.6e+53)
		tmp = 0.5 * sqrt((2.0 * (-im + re)));
	elseif (im <= -1.2e-158)
		tmp = t_0;
	elseif (im <= -3.8e-188)
		tmp = 0.5 * sqrt((2.0 * -im));
	elseif (im <= -2.6e-301)
		tmp = 0.5 * sqrt((2.0 * (re + re)));
	elseif (im <= 5.2e-30)
		tmp = t_0;
	else
		tmp = 0.5 * sqrt((2.0 * (re + im)));
	end
	tmp_2 = tmp;
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]
code[re_, im_] := Block[{t$95$0 = 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]}, If[LessEqual[im, -5.6e+53], N[(0.5 * N[Sqrt[N[(2.0 * N[((-im) + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[im, -1.2e-158], t$95$0, If[LessEqual[im, -3.8e-188], N[(0.5 * N[Sqrt[N[(2.0 * (-im)), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[im, -2.6e-301], N[(0.5 * N[Sqrt[N[(2.0 * N[(re + re), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision], If[LessEqual[im, 5.2e-30], t$95$0, N[(0.5 * N[Sqrt[N[(2.0 * N[(re + im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]]]]]]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
t_0 := 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\
\mathbf{if}\;im \leq -5.6 \cdot 10^{+53}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(-im\right) + re\right)}\\

\mathbf{elif}\;im \leq -1.2 \cdot 10^{-158}:\\
\;\;\;\;t_0\\

\mathbf{elif}\;im \leq -3.8 \cdot 10^{-188}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-im\right)}\\

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

\mathbf{elif}\;im \leq 5.2 \cdot 10^{-30}:\\
\;\;\;\;t_0\\

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


\end{array}

Error?

Try it out?

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original38.3
Target33.5
Herbie24.2
\[\begin{array}{l} \mathbf{if}\;re < 0:\\ \;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \end{array} \]

Derivation?

  1. Split input into 5 regimes
  2. if im < -5.6e53

    1. Initial program 45.5

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

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

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

      [Start]12.0

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

      rational.json-simplify-2 [=>]12.0

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

      rational.json-simplify-9 [=>]12.0

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

    if -5.6e53 < im < -1.20000000000000004e-158 or -2.5999999999999998e-301 < im < 5.19999999999999973e-30

    1. Initial program 32.4

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

    if -1.20000000000000004e-158 < im < -3.8e-188

    1. Initial program 44.6

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\left(-0.5 \cdot \frac{{re}^{2}}{im} + -1 \cdot im\right)} + re\right)} \]
    3. Simplified49.5

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

      [Start]49.5

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

      rational.json-simplify-1 [=>]49.5

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

      rational.json-simplify-2 [=>]49.5

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

      rational.json-simplify-9 [=>]49.5

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

      rational.json-simplify-2 [=>]49.5

      \[ 0.5 \cdot \sqrt{2 \cdot \left(\left(\left(-im\right) + \color{blue}{\frac{{re}^{2}}{im} \cdot -0.5}\right) + re\right)} \]
    4. Taylor expanded in im around inf 48.4

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(-1 \cdot im\right)}} \]
    5. Simplified48.4

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

      [Start]48.4

      \[ 0.5 \cdot \sqrt{2 \cdot \left(-1 \cdot im\right)} \]

      rational.json-simplify-2 [=>]48.4

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

      rational.json-simplify-8 [<=]48.4

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

    if -3.8e-188 < im < -2.5999999999999998e-301

    1. Initial program 42.5

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

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

    if 5.19999999999999973e-30 < im

    1. Initial program 39.6

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \]
    2. Taylor expanded in re around 0 15.9

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \leq -5.6 \cdot 10^{+53}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(-im\right) + re\right)}\\ \mathbf{elif}\;im \leq -1.2 \cdot 10^{-158}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{elif}\;im \leq -3.8 \cdot 10^{-188}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-im\right)}\\ \mathbf{elif}\;im \leq -2.6 \cdot 10^{-301}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\ \mathbf{elif}\;im \leq 5.2 \cdot 10^{-30}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \end{array} \]

Alternatives

Alternative 1
Error26.4
Cost7376
\[\begin{array}{l} t_0 := 0.5 \cdot \sqrt{2 \cdot \left(-im\right)}\\ t_1 := 0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\ \mathbf{if}\;im \leq -1.4 \cdot 10^{-113}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;im \leq -7.5 \cdot 10^{-159}:\\ \;\;\;\;t_1\\ \mathbf{elif}\;im \leq -8.5 \cdot 10^{-188}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;im \leq 1.12 \cdot 10^{-7}:\\ \;\;\;\;t_1\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \end{array} \]
Alternative 2
Error25.8
Cost7112
\[\begin{array}{l} \mathbf{if}\;im \leq -5.5 \cdot 10^{-114}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(-im\right) + re\right)}\\ \mathbf{elif}\;im \leq 1.12 \cdot 10^{-7}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \end{array} \]
Alternative 3
Error30.0
Cost6980
\[\begin{array}{l} \mathbf{if}\;im \leq -3.8 \cdot 10^{-307}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-im\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\ \end{array} \]
Alternative 4
Error47.4
Cost6784
\[0.5 \cdot \sqrt{2 \cdot \left(-im\right)} \]

Error

Reproduce?

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

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

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