Average Error: 26.3 → 26.3
Time: 14.4s
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}{\sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)}} \cdot \frac{\mathsf{fma}\left(x.re, y.re, x.im \cdot y.im\right)}{\sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)}}\]
\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\frac{1}{\sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)}} \cdot \frac{\mathsf{fma}\left(x.re, y.re, x.im \cdot y.im\right)}{\sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)}}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r3925477 = x_re;
        double r3925478 = y_re;
        double r3925479 = r3925477 * r3925478;
        double r3925480 = x_im;
        double r3925481 = y_im;
        double r3925482 = r3925480 * r3925481;
        double r3925483 = r3925479 + r3925482;
        double r3925484 = r3925478 * r3925478;
        double r3925485 = r3925481 * r3925481;
        double r3925486 = r3925484 + r3925485;
        double r3925487 = r3925483 / r3925486;
        return r3925487;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r3925488 = 1.0;
        double r3925489 = y_im;
        double r3925490 = y_re;
        double r3925491 = r3925490 * r3925490;
        double r3925492 = fma(r3925489, r3925489, r3925491);
        double r3925493 = sqrt(r3925492);
        double r3925494 = r3925488 / r3925493;
        double r3925495 = x_re;
        double r3925496 = x_im;
        double r3925497 = r3925496 * r3925489;
        double r3925498 = fma(r3925495, r3925490, r3925497);
        double r3925499 = r3925498 / r3925493;
        double r3925500 = r3925494 * r3925499;
        return r3925500;
}

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 26.3

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

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

    \[\leadsto \frac{\mathsf{fma}\left(x.re, y.re, x.im \cdot y.im\right)}{\color{blue}{\sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)} \cdot \sqrt{\mathsf{fma}\left(y.im, y.im, y.re \cdot y.re\right)}}}\]
  5. Applied associate-/r*26.2

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

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

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

Reproduce

herbie shell --seed 2019165 +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))))