Average Error: 25.8 → 25.8
Time: 15.7s
Precision: 64
\[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\[\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)}\]
\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\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)}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r3135210 = x_re;
        double r3135211 = y_re;
        double r3135212 = r3135210 * r3135211;
        double r3135213 = x_im;
        double r3135214 = y_im;
        double r3135215 = r3135213 * r3135214;
        double r3135216 = r3135212 + r3135215;
        double r3135217 = r3135211 * r3135211;
        double r3135218 = r3135214 * r3135214;
        double r3135219 = r3135217 + r3135218;
        double r3135220 = r3135216 / r3135219;
        return r3135220;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r3135221 = x_re;
        double r3135222 = y_re;
        double r3135223 = x_im;
        double r3135224 = y_im;
        double r3135225 = r3135223 * r3135224;
        double r3135226 = fma(r3135221, r3135222, r3135225);
        double r3135227 = r3135222 * r3135222;
        double r3135228 = fma(r3135224, r3135224, r3135227);
        double r3135229 = r3135226 / r3135228;
        return r3135229;
}

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.8

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

    \[\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. Final simplification25.8

    \[\leadsto \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)}\]

Reproduce

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