Average Error: 25.3 → 25.5
Time: 26.0s
Precision: 64
\[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\[\frac{1}{\mathsf{fma}\left(y.im, y.im, \left(y.re \cdot y.re\right)\right)} \cdot \mathsf{fma}\left(x.re, y.re, \left(x.im \cdot y.im\right)\right)\]
\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\frac{1}{\mathsf{fma}\left(y.im, y.im, \left(y.re \cdot y.re\right)\right)} \cdot \mathsf{fma}\left(x.re, y.re, \left(x.im \cdot y.im\right)\right)
double f(double x_re, double x_im, double y_re, double y_im) {
        double r3446616 = x_re;
        double r3446617 = y_re;
        double r3446618 = r3446616 * r3446617;
        double r3446619 = x_im;
        double r3446620 = y_im;
        double r3446621 = r3446619 * r3446620;
        double r3446622 = r3446618 + r3446621;
        double r3446623 = r3446617 * r3446617;
        double r3446624 = r3446620 * r3446620;
        double r3446625 = r3446623 + r3446624;
        double r3446626 = r3446622 / r3446625;
        return r3446626;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r3446627 = 1.0;
        double r3446628 = y_im;
        double r3446629 = y_re;
        double r3446630 = r3446629 * r3446629;
        double r3446631 = fma(r3446628, r3446628, r3446630);
        double r3446632 = r3446627 / r3446631;
        double r3446633 = x_re;
        double r3446634 = x_im;
        double r3446635 = r3446634 * r3446628;
        double r3446636 = fma(r3446633, r3446629, r3446635);
        double r3446637 = r3446632 * r3446636;
        return r3446637;
}

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 25.3

    \[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
  2. Simplified25.3

    \[\leadsto \color{blue}{\frac{\mathsf{fma}\left(x.re, y.re, \left(x.im \cdot y.im\right)\right)}{\mathsf{fma}\left(y.im, y.im, \left(y.re \cdot y.re\right)\right)}}\]
  3. Using strategy rm
  4. Applied div-inv25.5

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

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

Reproduce

herbie shell --seed 2019125 +o rules:numerics
(FPCore (x.re x.im y.re y.im)
  :name "_divideComplex, real part"
  (/ (+ (* x.re y.re) (* x.im y.im)) (+ (* y.re y.re) (* y.im y.im))))