Overview
Divide first vector of complexes element-wise by second.
Dispatcher Prototype
Inputs
Outputs
Example divide a complex vector by itself, demonstrating the result should be pretty close to 1+0j.
Numerical accuracy
The division of complex numbers (a + bj)/(c + dj) is calculated as (a*c + b*d)/(c*c + d*d) + (b*c - a*d)/(c*c + d*d) j.
Since Volk is built using unsafe math optimizations (-fcx-limited-range -funsafe-math-optimizations with gcc), after computing the two numerators and the denominator in the above formula, the compiler can either:
a) compute the two divisions; b) compute the inverse of the denominator, 1.0/(c*c + d*d), and then multiply this number by each of the numerators.
Under gcc, b) is allowed by -freciprocal-math, which is included in -funsafe-math-optimizations.
Depending on the architecture and the estimated cost of multiply and divide instructions, the compiler can perform a) or b). gcc performs a) under x86_64 and armv7, and b) under aarch64.
To avoid obtaining inf or nan in some architectures, care should be taken that c*c + d*d is not too small. In particular, if c*c + d*d < FLT_MAX, then the calculation of 1.0/(c*c + d*d) will yield inf.
For more information about numerical accuracy of complex division, see the following: