fork download
  1. #include <iostream>
  2. #include <complex>
  3.  
  4. // Smith's algorithm for robust complex division
  5. std::complex<double>
  6. ComplexDiv(std::complex<double> const a, std::complex<double> b)
  7. {
  8. if(std::abs(std::imag(b)) <= std::abs(std::real(b))) {
  9. double r = std::imag(b) / std::real(b);
  10. double den = std::real(b) + (std::imag(b) * r);
  11. return std::complex<double>
  12. (
  13. (std::real(a) + r * std::imag(a)) / den,
  14. (std::imag(a) - r * std::real(a)) / den
  15. );
  16. } else {
  17. double r = std::real(b) / std::imag(b);
  18. double den = std::real(b) * r + std::imag(b);
  19. return std::complex<double>
  20. (
  21. (std::real(a) * r + std::imag(a)) / den,
  22. (std::imag(a) * r - std::real(a)) / den
  23. );
  24. }
  25. }
  26.  
  27. int main()
  28. {
  29. std::complex<double> a = {1.0, 0.0};
  30. std::complex<double> b = {1.e-162, 0.0};
  31. std::cout << "Smith's Algorithm Result = " << ComplexDiv(a, b) << std::endl;
  32. std::cout << "Impementation Result = " << a / b << std::endl;
  33. return 0;
  34. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Smith's Algorithm Result = (1e+162,0)
Impementation Result     = (1e+162,0)