Average Error: 25.1 → 25.0
Time: 15.8s
Precision: 64
\[\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\[\frac{\frac{y.re \cdot x.im - y.im \cdot x.re}{\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)}}\]
\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\frac{\frac{y.re \cdot x.im - y.im \cdot x.re}{\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)}}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r3283069 = x_im;
        double r3283070 = y_re;
        double r3283071 = r3283069 * r3283070;
        double r3283072 = x_re;
        double r3283073 = y_im;
        double r3283074 = r3283072 * r3283073;
        double r3283075 = r3283071 - r3283074;
        double r3283076 = r3283070 * r3283070;
        double r3283077 = r3283073 * r3283073;
        double r3283078 = r3283076 + r3283077;
        double r3283079 = r3283075 / r3283078;
        return r3283079;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r3283080 = y_re;
        double r3283081 = x_im;
        double r3283082 = r3283080 * r3283081;
        double r3283083 = y_im;
        double r3283084 = x_re;
        double r3283085 = r3283083 * r3283084;
        double r3283086 = r3283082 - r3283085;
        double r3283087 = r3283080 * r3283080;
        double r3283088 = fma(r3283083, r3283083, r3283087);
        double r3283089 = sqrt(r3283088);
        double r3283090 = r3283086 / r3283089;
        double r3283091 = r3283090 / r3283089;
        return r3283091;
}

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

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

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

    \[\leadsto \frac{x.im \cdot y.re - x.re \cdot y.im}{\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*25.0

    \[\leadsto \color{blue}{\frac{\frac{x.im \cdot y.re - x.re \cdot y.im}{\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. Taylor expanded around inf 25.0

    \[\leadsto \frac{\frac{\color{blue}{y.re \cdot x.im - y.im \cdot x.re}}{\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)}}\]
  7. Final simplification25.0

    \[\leadsto \frac{\frac{y.re \cdot x.im - y.im \cdot x.re}{\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)}}\]

Reproduce

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