Average Error: 1.1 → 1.1
Time: 10.8s
Precision: 64
\[\frac{\left(\left(x.im \cdot y.re\right) - \left(x.re \cdot y.im\right)\right)}{\left(\frac{\left(y.re \cdot y.re\right)}{\left(y.im \cdot y.im\right)}\right)}\]
\[\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\frac{\left(\left(x.im \cdot y.re\right) - \left(x.re \cdot y.im\right)\right)}{\left(\frac{\left(y.re \cdot y.re\right)}{\left(y.im \cdot y.im\right)}\right)}
\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
double f(double x_re, double x_im, double y_re, double y_im) {
        double r1089063 = x_im;
        double r1089064 = y_re;
        double r1089065 = r1089063 * r1089064;
        double r1089066 = x_re;
        double r1089067 = y_im;
        double r1089068 = r1089066 * r1089067;
        double r1089069 = r1089065 - r1089068;
        double r1089070 = r1089064 * r1089064;
        double r1089071 = r1089067 * r1089067;
        double r1089072 = r1089070 + r1089071;
        double r1089073 = r1089069 / r1089072;
        return r1089073;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r1089074 = x_im;
        double r1089075 = y_re;
        double r1089076 = r1089074 * r1089075;
        double r1089077 = x_re;
        double r1089078 = y_im;
        double r1089079 = r1089077 * r1089078;
        double r1089080 = r1089076 - r1089079;
        double r1089081 = r1089075 * r1089075;
        double r1089082 = r1089078 * r1089078;
        double r1089083 = r1089081 + r1089082;
        double r1089084 = r1089080 / r1089083;
        return r1089084;
}

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 1.1

    \[\frac{\left(\left(x.im \cdot y.re\right) - \left(x.re \cdot y.im\right)\right)}{\left(\frac{\left(y.re \cdot y.re\right)}{\left(y.im \cdot y.im\right)}\right)}\]
  2. Final simplification1.1

    \[\leadsto \frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]

Reproduce

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