#include <iostream>
#include <complex>
// Smith's algorithm for robust complex division
std::complex<double>
ComplexDiv(std::complex<double> const a, std::complex<double> b)
{
if(std::abs(std::imag(b)) <= std::abs(std::real(b))) {
double r = std::imag(b) / std::real(b);
double den = std::real(b) + (std::imag(b) * r);
return std::complex<double>
(
(std::real(a) + r * std::imag(a)) / den,
(std::imag(a) - r * std::real(a)) / den
);
} else {
double r = std::real(b) / std::imag(b);
double den = std::real(b) * r + std::imag(b);
return std::complex<double>
(
(std::real(a) * r + std::imag(a)) / den,
(std::imag(a) * r - std::real(a)) / den
);
}
}
int main()
{
std::complex<double> a = {1.0, 0.0};
std::complex<double> b = {1.e-162, 0.0};
std::cout << "Smith's Algorithm Result = " << ComplexDiv(a, b) << std::endl;
std::cout << "Impementation Result = " << a / b << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y29tcGxleD4KIAovLyBTbWl0aCdzIGFsZ29yaXRobSBmb3Igcm9idXN0IGNvbXBsZXggZGl2aXNpb24Kc3RkOjpjb21wbGV4PGRvdWJsZT4gCkNvbXBsZXhEaXYoc3RkOjpjb21wbGV4PGRvdWJsZT4gY29uc3QgYSwgc3RkOjpjb21wbGV4PGRvdWJsZT4gYikKewogIGlmKHN0ZDo6YWJzKHN0ZDo6aW1hZyhiKSkgPD0gc3RkOjphYnMoc3RkOjpyZWFsKGIpKSkgewogICAgZG91YmxlIHIgICA9IHN0ZDo6aW1hZyhiKSAvIHN0ZDo6cmVhbChiKTsKICAgIGRvdWJsZSBkZW4gPSBzdGQ6OnJlYWwoYikgKyAoc3RkOjppbWFnKGIpICogcik7IAogICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxkb3VibGU+CiAgICAgICAgICAgICAoCiAgICAgICAgICAgICAoc3RkOjpyZWFsKGEpICsgciAqIHN0ZDo6aW1hZyhhKSkgLyBkZW4sIAogICAgICAgICAgICAgKHN0ZDo6aW1hZyhhKSAtIHIgKiBzdGQ6OnJlYWwoYSkpIC8gZGVuCiAgICAgICAgICAgICApOwogIH0gZWxzZSB7CiAgICBkb3VibGUgciAgID0gc3RkOjpyZWFsKGIpIC8gc3RkOjppbWFnKGIpOwogICAgZG91YmxlIGRlbiA9IHN0ZDo6cmVhbChiKSAqIHIgKyBzdGQ6OmltYWcoYik7IAogICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxkb3VibGU+CiAgICAgICAgICAgICAoCiAgICAgICAgICAgICAoc3RkOjpyZWFsKGEpICogciArIHN0ZDo6aW1hZyhhKSkgLyBkZW4sCiAgICAgICAgICAgICAoc3RkOjppbWFnKGEpICogciAtIHN0ZDo6cmVhbChhKSkgLyBkZW4KICAgICAgICAgICAgICk7ICAKICB9Cn0KIAppbnQgbWFpbigpCnsKICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBhID0gezEuMCwgMC4wfTsKICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBiID0gezEuZS0xNjIsIDAuMH07CiAgc3RkOjpjb3V0IDw8ICJTbWl0aCdzIEFsZ29yaXRobSBSZXN1bHQgPSAiIDw8IENvbXBsZXhEaXYoYSwgYikgPDwgc3RkOjplbmRsOwogIHN0ZDo6Y291dCA8PCAiSW1wZW1lbnRhdGlvbiBSZXN1bHQgICAgID0gIiA8PCBhIC8gYiAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICByZXR1cm4gMDsKfQ==