Average Error: 25.4 → 25.3
Time: 11.0s
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{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)}}\]
\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\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)}}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r969194 = x_im;
        double r969195 = y_re;
        double r969196 = r969194 * r969195;
        double r969197 = x_re;
        double r969198 = y_im;
        double r969199 = r969197 * r969198;
        double r969200 = r969196 - r969199;
        double r969201 = r969195 * r969195;
        double r969202 = r969198 * r969198;
        double r969203 = r969201 + r969202;
        double r969204 = r969200 / r969203;
        return r969204;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r969205 = x_im;
        double r969206 = y_re;
        double r969207 = r969205 * r969206;
        double r969208 = x_re;
        double r969209 = y_im;
        double r969210 = r969208 * r969209;
        double r969211 = r969207 - r969210;
        double r969212 = r969206 * r969206;
        double r969213 = fma(r969209, r969209, r969212);
        double r969214 = sqrt(r969213);
        double r969215 = r969211 / r969214;
        double r969216 = r969215 / r969214;
        return r969216;
}

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

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

    \[\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.4

    \[\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.3

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

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

Reproduce

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