Average Error: 0.5 → 0.2
Time: 1.1s
Precision: binary64
\[x.re \cdot y.im + x.im \cdot y.re \]
\[\mathsf{fma}\left(y.re, x.im, x.re \cdot y.im\right) \]
x.re \cdot y.im + x.im \cdot y.re
\mathsf{fma}\left(y.re, x.im, x.re \cdot y.im\right)
(FPCore (x.re x.im y.re y.im)
 :precision binary64
 (+ (* x.re y.im) (* x.im y.re)))
(FPCore (x.re x.im y.re y.im)
 :precision binary64
 (fma y.re x.im (* x.re y.im)))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
	return (x_46_re * y_46_im) + (x_46_im * y_46_re);
}
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
	return fma(y_46_re, x_46_im, (x_46_re * y_46_im));
}

Error

Bits error versus x.re

Bits error versus x.im

Bits error versus y.re

Bits error versus y.im

Derivation

  1. Initial program 0.5

    \[x.re \cdot y.im + x.im \cdot y.re \]
  2. Simplified0.3

    \[\leadsto \color{blue}{\mathsf{fma}\left(x.re, y.im, x.im \cdot y.re\right)} \]
  3. Taylor expanded in x.re around 0 0.5

    \[\leadsto \color{blue}{x.re \cdot y.im + y.re \cdot x.im} \]
  4. Simplified0.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(y.re, x.im, x.re \cdot y.im\right)} \]
  5. Final simplification0.2

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

Reproduce

herbie shell --seed 2022067 
(FPCore (x.re x.im y.re y.im)
  :name "_multiplyComplex, imaginary part"
  :precision binary64
  (+ (* x.re y.im) (* x.im y.re)))