Average Error: 1.1 → 1.1
Time: 4.6s
Precision: 64
\[\frac{\left(\frac{\left(x.re \cdot y.re\right)}{\left(x.im \cdot y.im\right)}\right)}{\left(\frac{\left(y.re \cdot y.re\right)}{\left(y.im \cdot y.im\right)}\right)}\]
\[\frac{x.re \cdot y.re + x.im \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}\]
\frac{\left(\frac{\left(x.re \cdot y.re\right)}{\left(x.im \cdot y.im\right)}\right)}{\left(\frac{\left(y.re \cdot y.re\right)}{\left(y.im \cdot y.im\right)}\right)}
\frac{x.re \cdot y.re + x.im \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 r552147 = x_re;
        double r552148 = y_re;
        double r552149 = r552147 * r552148;
        double r552150 = x_im;
        double r552151 = y_im;
        double r552152 = r552150 * r552151;
        double r552153 = r552149 + r552152;
        double r552154 = r552148 * r552148;
        double r552155 = r552151 * r552151;
        double r552156 = r552154 + r552155;
        double r552157 = r552153 / r552156;
        return r552157;
}

double f(double x_re, double x_im, double y_re, double y_im) {
        double r552158 = x_re;
        double r552159 = y_re;
        double r552160 = r552158 * r552159;
        double r552161 = x_im;
        double r552162 = y_im;
        double r552163 = r552161 * r552162;
        double r552164 = r552160 + r552163;
        double r552165 = r552159 * r552159;
        double r552166 = r552162 * r552162;
        double r552167 = r552165 + r552166;
        double r552168 = r552164 / r552167;
        return r552168;
}

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(\frac{\left(x.re \cdot y.re\right)}{\left(x.im \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.re \cdot y.re + x.im \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, real part"
  (/.p16 (+.p16 (*.p16 x.re y.re) (*.p16 x.im y.im)) (+.p16 (*.p16 y.re y.re) (*.p16 y.im y.im))))