math.abs on complex (squared)

?

Percentage Accurate: 100.0% → 100.0%
Time: 2.0s
Precision: binary64
Cost: 6720

?

\[re \cdot re + im \cdot im \]
\[\mathsf{fma}\left(im, im, re \cdot re\right) \]
(FPCore modulus_sqr (re im) :precision binary64 (+ (* re re) (* im im)))
(FPCore modulus_sqr (re im) :precision binary64 (fma im im (* re re)))
double modulus_sqr(double re, double im) {
	return (re * re) + (im * im);
}
double modulus_sqr(double re, double im) {
	return fma(im, im, (re * re));
}
function modulus_sqr(re, im)
	return Float64(Float64(re * re) + Float64(im * im))
end
function modulus_sqr(re, im)
	return fma(im, im, Float64(re * re))
end
modulus$95$sqr[re_, im_] := N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]
modulus$95$sqr[re_, im_] := N[(im * im + N[(re * re), $MachinePrecision]), $MachinePrecision]
re \cdot re + im \cdot im
\mathsf{fma}\left(im, im, re \cdot re\right)

Local Percentage Accuracy?

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.

Derivation?

  1. Initial program 100.0%

    \[re \cdot re + im \cdot im \]
  2. Taylor expanded in re around 0 100.0%

    \[\leadsto \color{blue}{{re}^{2} + {im}^{2}} \]
  3. Simplified100.0%

    \[\leadsto \color{blue}{\mathsf{fma}\left(im, im, re \cdot re\right)} \]
    Step-by-step derivation

    [Start]100.0

    \[ {re}^{2} + {im}^{2} \]

    unpow2 [=>]100.0

    \[ \color{blue}{re \cdot re} + {im}^{2} \]

    unpow2 [=>]100.0

    \[ re \cdot re + \color{blue}{im \cdot im} \]

    +-commutative [=>]100.0

    \[ \color{blue}{im \cdot im + re \cdot re} \]

    fma-udef [<=]100.0

    \[ \color{blue}{\mathsf{fma}\left(im, im, re \cdot re\right)} \]
  4. Final simplification100.0%

    \[\leadsto \mathsf{fma}\left(im, im, re \cdot re\right) \]

Alternatives

Alternative 1
Accuracy100.0%
Cost448
\[re \cdot re + im \cdot im \]
Alternative 2
Accuracy69.3%
Cost324
\[\begin{array}{l} \mathbf{if}\;im \leq 9.2 \cdot 10^{-86}:\\ \;\;\;\;re \cdot re\\ \mathbf{else}:\\ \;\;\;\;im \cdot im\\ \end{array} \]
Alternative 3
Accuracy57.0%
Cost192
\[im \cdot im \]

Error

Reproduce?

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