Average Error: 26.7 → 2.5
Time: 15.7s
Precision: binary64
Cost: 20480
\[\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im} \]
\[\mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, y.re \cdot \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.re}{\left(-y.im\right) - \frac{y.re}{\frac{y.im}{y.re}}}\right) \]
(FPCore (x.re x.im y.re y.im)
 :precision binary64
 (/ (- (* x.im y.re) (* x.re y.im)) (+ (* y.re y.re) (* y.im y.im))))
(FPCore (x.re x.im y.re y.im)
 :precision binary64
 (fma
  (/ 1.0 (hypot y.re y.im))
  (* y.re (/ x.im (hypot y.re y.im)))
  (/ x.re (- (- y.im) (/ y.re (/ y.im y.re))))))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
	return ((x_46_im * y_46_re) - (x_46_re * y_46_im)) / ((y_46_re * y_46_re) + (y_46_im * y_46_im));
}
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
	return fma((1.0 / hypot(y_46_re, y_46_im)), (y_46_re * (x_46_im / hypot(y_46_re, y_46_im))), (x_46_re / (-y_46_im - (y_46_re / (y_46_im / y_46_re)))));
}
function code(x_46_re, x_46_im, y_46_re, y_46_im)
	return Float64(Float64(Float64(x_46_im * y_46_re) - Float64(x_46_re * y_46_im)) / Float64(Float64(y_46_re * y_46_re) + Float64(y_46_im * y_46_im)))
end
function code(x_46_re, x_46_im, y_46_re, y_46_im)
	return fma(Float64(1.0 / hypot(y_46_re, y_46_im)), Float64(y_46_re * Float64(x_46_im / hypot(y_46_re, y_46_im))), Float64(x_46_re / Float64(Float64(-y_46_im) - Float64(y_46_re / Float64(y_46_im / y_46_re)))))
end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := N[(N[(N[(x$46$im * y$46$re), $MachinePrecision] - N[(x$46$re * y$46$im), $MachinePrecision]), $MachinePrecision] / N[(N[(y$46$re * y$46$re), $MachinePrecision] + N[(y$46$im * y$46$im), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := N[(N[(1.0 / N[Sqrt[y$46$re ^ 2 + y$46$im ^ 2], $MachinePrecision]), $MachinePrecision] * N[(y$46$re * N[(x$46$im / N[Sqrt[y$46$re ^ 2 + y$46$im ^ 2], $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x$46$re / N[((-y$46$im) - N[(y$46$re / N[(y$46$im / y$46$re), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im}
\mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, y.re \cdot \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.re}{\left(-y.im\right) - \frac{y.re}{\frac{y.im}{y.re}}}\right)

Error

Derivation

  1. Initial program 26.7

    \[\frac{x.im \cdot y.re - x.re \cdot y.im}{y.re \cdot y.re + y.im \cdot y.im} \]
  2. Applied egg-rr22.6

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.im \cdot y.re}{\mathsf{hypot}\left(y.re, y.im\right)}, -\frac{x.re \cdot y.im}{{\left(\mathsf{hypot}\left(y.re, y.im\right)\right)}^{2}}\right)} \]
  3. Simplified13.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)} \cdot y.re, \frac{x.re}{\frac{{\left(\mathsf{hypot}\left(y.re, y.im\right)\right)}^{2}}{-y.im}}\right)} \]
    Proof
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (*.f64 (/.f64 x.im (hypot.f64 y.re y.im)) y.re) (/.f64 x.re (/.f64 (pow.f64 (hypot.f64 y.re y.im) 2) (neg.f64 y.im)))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (Rewrite<= associate-/r/_binary64 (/.f64 x.im (/.f64 (hypot.f64 y.re y.im) y.re))) (/.f64 x.re (/.f64 (pow.f64 (hypot.f64 y.re y.im) 2) (neg.f64 y.im)))): 11 points increase in error, 6 points decrease in error
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 x.im y.re) (hypot.f64 y.re y.im))) (/.f64 x.re (/.f64 (pow.f64 (hypot.f64 y.re y.im) 2) (neg.f64 y.im)))): 35 points increase in error, 7 points decrease in error
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (/.f64 (*.f64 x.im y.re) (hypot.f64 y.re y.im)) (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 x.re (neg.f64 y.im)) (pow.f64 (hypot.f64 y.re y.im) 2)))): 41 points increase in error, 10 points decrease in error
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (/.f64 (*.f64 x.im y.re) (hypot.f64 y.re y.im)) (/.f64 (Rewrite<= distribute-rgt-neg-in_binary64 (neg.f64 (*.f64 x.re y.im))) (pow.f64 (hypot.f64 y.re y.im) 2))): 0 points increase in error, 0 points decrease in error
    (fma.f64 (/.f64 1 (hypot.f64 y.re y.im)) (/.f64 (*.f64 x.im y.re) (hypot.f64 y.re y.im)) (Rewrite<= distribute-neg-frac_binary64 (neg.f64 (/.f64 (*.f64 x.re y.im) (pow.f64 (hypot.f64 y.re y.im) 2))))): 0 points increase in error, 0 points decrease in error
  4. Taylor expanded in y.re around 0 4.6

    \[\leadsto \mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)} \cdot y.re, \frac{x.re}{\color{blue}{-1 \cdot \frac{{y.re}^{2}}{y.im} + -1 \cdot y.im}}\right) \]
  5. Simplified2.5

    \[\leadsto \mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)} \cdot y.re, \frac{x.re}{\color{blue}{\left(-y.im\right) - \frac{y.re}{\frac{y.im}{y.re}}}}\right) \]
    Proof
    (-.f64 (neg.f64 y.im) (/.f64 y.re (/.f64 y.im y.re))): 0 points increase in error, 0 points decrease in error
    (-.f64 (Rewrite<= mul-1-neg_binary64 (*.f64 -1 y.im)) (/.f64 y.re (/.f64 y.im y.re))): 0 points increase in error, 0 points decrease in error
    (-.f64 (*.f64 -1 y.im) (Rewrite<= associate-/l*_binary64 (/.f64 (*.f64 y.re y.re) y.im))): 32 points increase in error, 13 points decrease in error
    (-.f64 (*.f64 -1 y.im) (/.f64 (Rewrite<= unpow2_binary64 (pow.f64 y.re 2)) y.im)): 0 points increase in error, 0 points decrease in error
    (Rewrite<= unsub-neg_binary64 (+.f64 (*.f64 -1 y.im) (neg.f64 (/.f64 (pow.f64 y.re 2) y.im)))): 0 points increase in error, 0 points decrease in error
    (+.f64 (*.f64 -1 y.im) (Rewrite<= mul-1-neg_binary64 (*.f64 -1 (/.f64 (pow.f64 y.re 2) y.im)))): 0 points increase in error, 0 points decrease in error
    (Rewrite<= +-commutative_binary64 (+.f64 (*.f64 -1 (/.f64 (pow.f64 y.re 2) y.im)) (*.f64 -1 y.im))): 0 points increase in error, 0 points decrease in error
  6. Final simplification2.5

    \[\leadsto \mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, y.re \cdot \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{x.re}{\left(-y.im\right) - \frac{y.re}{\frac{y.im}{y.re}}}\right) \]

Alternatives

Alternative 1
Error8.4
Cost20624
\[\begin{array}{l} t_0 := \frac{\frac{y.re \cdot x.im - y.im \cdot x.re}{\mathsf{hypot}\left(y.re, y.im\right)}}{\mathsf{hypot}\left(y.re, y.im\right)}\\ t_1 := \mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, y.re \cdot \frac{x.im}{\mathsf{hypot}\left(y.re, y.im\right)}, \frac{-x.re}{y.im}\right)\\ \mathbf{if}\;y.im \leq -1.1 \cdot 10^{+84}:\\ \;\;\;\;t_1\\ \mathbf{elif}\;y.im \leq -4.4 \cdot 10^{-190}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.im \leq 3.5 \cdot 10^{-94}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{elif}\;y.im \leq 3.5 \cdot 10^{+59}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;t_1\\ \end{array} \]
Alternative 2
Error8.6
Cost14788
\[\begin{array}{l} t_0 := y.re \cdot x.im - y.im \cdot x.re\\ \mathbf{if}\;\frac{t_0}{y.re \cdot y.re + y.im \cdot y.im} \leq 2 \cdot 10^{+245}:\\ \;\;\;\;\frac{\frac{t_0}{\mathsf{hypot}\left(y.re, y.im\right)}}{\mathsf{hypot}\left(y.re, y.im\right)}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{\mathsf{hypot}\left(y.re, y.im\right)}, x.im, \frac{x.re}{\left(-y.im\right) - \frac{y.re}{\frac{y.im}{y.re}}}\right)\\ \end{array} \]
Alternative 3
Error10.0
Cost14160
\[\begin{array}{l} t_0 := \frac{\frac{y.re \cdot x.im - y.im \cdot x.re}{\mathsf{hypot}\left(y.re, y.im\right)}}{\mathsf{hypot}\left(y.re, y.im\right)}\\ \mathbf{if}\;y.im \leq -1.06 \cdot 10^{+133}:\\ \;\;\;\;\frac{y.re}{y.im} \cdot \frac{x.im}{y.im} - \frac{x.re}{y.im}\\ \mathbf{elif}\;y.im \leq -2.5 \cdot 10^{-187}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.im \leq 2.7 \cdot 10^{-96}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{elif}\;y.im \leq 1.4 \cdot 10^{+80}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{y.re}{\frac{y.im}{x.im}} - x.re}{\mathsf{hypot}\left(y.re, y.im\right)}\\ \end{array} \]
Alternative 4
Error12.0
Cost7300
\[\begin{array}{l} t_0 := \frac{y.re \cdot x.im - y.im \cdot x.re}{y.re \cdot y.re + y.im \cdot y.im}\\ \mathbf{if}\;y.re \leq -2.15 \cdot 10^{+99}:\\ \;\;\;\;\mathsf{fma}\left(x.re \cdot \frac{-y.im}{y.re}, \frac{1}{y.re}, \frac{x.im}{y.re}\right)\\ \mathbf{elif}\;y.re \leq -1.15 \cdot 10^{-79}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.re \leq 2.35 \cdot 10^{-91}:\\ \;\;\;\;x.im \cdot \frac{\frac{y.re}{y.im}}{y.im} - \frac{x.re}{y.im}\\ \mathbf{elif}\;y.re \leq 3.4 \cdot 10^{+137}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \end{array} \]
Alternative 5
Error12.0
Cost1488
\[\begin{array}{l} t_0 := \frac{y.re \cdot x.im - y.im \cdot x.re}{y.re \cdot y.re + y.im \cdot y.im}\\ \mathbf{if}\;y.re \leq -6.6 \cdot 10^{+101}:\\ \;\;\;\;\frac{x.im - x.re \cdot \frac{y.im}{y.re}}{y.re}\\ \mathbf{elif}\;y.re \leq -8.2 \cdot 10^{-80}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.re \leq 3 \cdot 10^{-92}:\\ \;\;\;\;x.im \cdot \frac{\frac{y.re}{y.im}}{y.im} - \frac{x.re}{y.im}\\ \mathbf{elif}\;y.re \leq 1.2 \cdot 10^{+138}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \end{array} \]
Alternative 6
Error16.0
Cost1296
\[\begin{array}{l} t_0 := \frac{y.re}{y.im} \cdot \frac{x.im}{y.im} - \frac{x.re}{y.im}\\ \mathbf{if}\;y.im \leq -2.15 \cdot 10^{-7}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.im \leq 4.7 \cdot 10^{-85}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{elif}\;y.im \leq 2.6 \cdot 10^{-64}:\\ \;\;\;\;\frac{y.re \cdot x.im - y.im \cdot x.re}{y.im \cdot y.im}\\ \mathbf{elif}\;y.im \leq 4.5 \cdot 10^{+22}:\\ \;\;\;\;\frac{y.im \cdot \left(-x.re\right)}{y.re \cdot y.re + y.im \cdot y.im}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 7
Error15.7
Cost1232
\[\begin{array}{l} t_0 := \frac{y.re}{y.im} \cdot \frac{x.im}{y.im} - \frac{x.re}{y.im}\\ \mathbf{if}\;y.im \leq -2.25 \cdot 10^{-7}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.im \leq 4.7 \cdot 10^{-85}:\\ \;\;\;\;\frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{elif}\;y.im \leq 7 \cdot 10^{-65}:\\ \;\;\;\;\frac{y.re \cdot x.im - y.im \cdot x.re}{y.im \cdot y.im}\\ \mathbf{elif}\;y.im \leq 8.2 \cdot 10^{+20}:\\ \;\;\;\;\frac{x.im - x.re \cdot \frac{y.im}{y.re}}{y.re}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 8
Error16.3
Cost968
\[\begin{array}{l} t_0 := \frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{if}\;y.re \leq -8.5 \cdot 10^{+54}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.re \leq 1.25 \cdot 10^{-81}:\\ \;\;\;\;\frac{y.re}{y.im} \cdot \frac{x.im}{y.im} - \frac{x.re}{y.im}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 9
Error19.1
Cost840
\[\begin{array}{l} t_0 := \frac{x.im - x.re \cdot \frac{y.im}{y.re}}{y.re}\\ \mathbf{if}\;y.re \leq -1.55 \cdot 10^{+19}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.re \leq 4.1 \cdot 10^{-78}:\\ \;\;\;\;\frac{-x.re}{y.im}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 10
Error18.9
Cost840
\[\begin{array}{l} t_0 := \frac{x.im - y.im \cdot \frac{x.re}{y.re}}{y.re}\\ \mathbf{if}\;y.re \leq -5.8 \cdot 10^{+16}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;y.re \leq 3.7 \cdot 10^{-85}:\\ \;\;\;\;\frac{-x.re}{y.im}\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 11
Error23.2
Cost520
\[\begin{array}{l} \mathbf{if}\;y.re \leq -6.4 \cdot 10^{+19}:\\ \;\;\;\;\frac{x.im}{y.re}\\ \mathbf{elif}\;y.re \leq 4.3 \cdot 10^{-78}:\\ \;\;\;\;\frac{-x.re}{y.im}\\ \mathbf{else}:\\ \;\;\;\;\frac{x.im}{y.re}\\ \end{array} \]
Alternative 12
Error34.6
Cost456
\[\begin{array}{l} \mathbf{if}\;y.im \leq -2.1 \cdot 10^{+172}:\\ \;\;\;\;\frac{x.re}{y.im}\\ \mathbf{elif}\;y.im \leq 1.4 \cdot 10^{+137}:\\ \;\;\;\;\frac{x.im}{y.re}\\ \mathbf{else}:\\ \;\;\;\;\frac{x.re}{y.im}\\ \end{array} \]
Alternative 13
Error36.8
Cost192
\[\frac{x.im}{y.re} \]

Error

Reproduce

herbie shell --seed 2022337 
(FPCore (x.re x.im y.re y.im)
  :name "_divideComplex, imaginary part"
  :precision binary64
  (/ (- (* x.im y.re) (* x.re y.im)) (+ (* y.re y.re) (* y.im y.im))))