Average Error: 31.6 → 17.8
Time: 1.2s
Precision: binary64
Cost: 8132
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;im \leq -1.1325242560558167 \cdot 10^{+35}:\\ \;\;\;\;-im\\ \mathbf{elif}\;im \leq -5.718831503715847 \cdot 10^{-283}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;im \leq 1.0524581835653178 \cdot 10^{-248}:\\ \;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\ \mathbf{elif}\;im \leq 1.4546659687059033 \cdot 10^{+125}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;im\\ \end{array}\]
\sqrt{re \cdot re + im \cdot im}
\begin{array}{l}
\mathbf{if}\;im \leq -1.1325242560558167 \cdot 10^{+35}:\\
\;\;\;\;-im\\

\mathbf{elif}\;im \leq -5.718831503715847 \cdot 10^{-283}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

\mathbf{elif}\;im \leq 1.0524581835653178 \cdot 10^{-248}:\\
\;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\

\mathbf{elif}\;im \leq 1.4546659687059033 \cdot 10^{+125}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

\mathbf{else}:\\
\;\;\;\;im\\

\end{array}
(FPCore (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
(FPCore (re im)
 :precision binary64
 (if (<= im -1.1325242560558167e+35)
   (- im)
   (if (<= im -5.718831503715847e-283)
     (sqrt (+ (* re re) (* im im)))
     (if (<= im 1.0524581835653178e-248)
       (- (* (/ (* im im) re) -0.5) re)
       (if (<= im 1.4546659687059033e+125)
         (sqrt (+ (* re re) (* im im)))
         im)))))
double code(double re, double im) {
	return sqrt((re * re) + (im * im));
}
double code(double re, double im) {
	double tmp;
	if (im <= -1.1325242560558167e+35) {
		tmp = -im;
	} else if (im <= -5.718831503715847e-283) {
		tmp = sqrt((re * re) + (im * im));
	} else if (im <= 1.0524581835653178e-248) {
		tmp = (((im * im) / re) * -0.5) - re;
	} else if (im <= 1.4546659687059033e+125) {
		tmp = sqrt((re * re) + (im * im));
	} else {
		tmp = im;
	}
	return tmp;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 4 regimes
  2. if im < -1.13252425605581673e35

    1. Initial program 43.0

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around -inf 12.9

      \[\leadsto \color{blue}{-1 \cdot im}\]
    3. Simplified12.9

      \[\leadsto \color{blue}{-im}\]

    if -1.13252425605581673e35 < im < -5.7188315037158467e-283 or 1.05245818356531775e-248 < im < 1.4546659687059033e125

    1. Initial program 20.4

      \[\sqrt{re \cdot re + im \cdot im}\]

    if -5.7188315037158467e-283 < im < 1.05245818356531775e-248

    1. Initial program 31.2

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around -inf 32.6

      \[\leadsto \color{blue}{-\left(re + 0.5 \cdot \frac{{im}^{2}}{re}\right)}\]
    3. Simplified32.6

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

    if 1.4546659687059033e125 < im

    1. Initial program 56.6

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around 0 8.6

      \[\leadsto \color{blue}{im}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification17.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \leq -1.1325242560558167 \cdot 10^{+35}:\\ \;\;\;\;-im\\ \mathbf{elif}\;im \leq -5.718831503715847 \cdot 10^{-283}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;im \leq 1.0524581835653178 \cdot 10^{-248}:\\ \;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\ \mathbf{elif}\;im \leq 1.4546659687059033 \cdot 10^{+125}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;im\\ \end{array}\]

Reproduce

herbie shell --seed 2021042 
(FPCore (re im)
  :name "math.abs on complex"
  :precision binary64
  (sqrt (+ (* re re) (* im im))))