c ++在虚部显示复数i

时间:2016-10-25 16:27:07

标签: c++ complex-numbers

我正在做类似的事情:

int real_part, imaginary_part;
cout<<"Please enter realpart and imaginary part"<<endl;
cin>>real_part;
cin>>imaginary_part;
complex<double> mycomplex (real_part, imaginary_part);
cout<<mycomplex<<endl; // I want to display like -2+5i but I get (-2, 5)

我是c ++的新手

如何与i -2+5i一起显示?或者我必须添加i char与想象部分?

4 个答案:

答案 0 :(得分:3)

您可以根据需要使用std::real()std::imag()进行格式化,请参阅complex here

当然,您必须自己检查标志。

这样的事情:

std::cout
   << std::real(mycomplex)
   << (std::imag(mycomplex) >= 0.0 ? "+" : "")
   << std::imag(mycomplex)
   << " i"
   << std::endl;

答案 1 :(得分:1)

您可以简单地写一下:

cout<< mycomplex.real << std::showpos << mycomplex.imag << "i" << endl;

答案 2 :(得分:1)

为了与其他答案完整起见。您可以使用std::showpos更轻松地将输出格式化为已签名的内容

cout << real(mycomplex) << std::showpos << imag(mycomplex) << "i";

答案 3 :(得分:0)

如果您真的很偷偷摸摸,或者使用的是您不想在任何地方都不能修改的库(例如,我使用它以八度/ matlab兼容格式打印本征矩阵),则可以专门使用put-to运算符包括<complex>之前的类型。我怀疑这违反了标准,因为它会在std::中乱码,但是它可以在g ++(7.3.1)和clang ++(5.0)中工作:

/*
 * this stuff can go in a header to make std::complex<> available
 */
typedef double real_t;

#include <iostream>

#define SPECIALIZED_COMPLEX_PUTTO
#ifdef SPECIALIZED_COMPLEX_PUTTO
#ifdef _LIBCPP_BEGIN_NAMESPACE_STD // for clang++ libs
_LIBCPP_BEGIN_NAMESPACE_STD
#else
namespace std {
#endif
template <typename T> class complex;

template <class T, class CharT, class Traits>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
  const std::complex<T>& x);

// specialization for real_t, instantiate later
template<>
basic_ostream<char>&
operator<<(basic_ostream<char> & o, const complex<real_t> & x);
#ifdef _LIBCPP_END_NAMESPACE_STD // for clang++
_LIBCPP_END_NAMESPACE_STD
#else
}
#endif


#include <complex>

/*
 * below here can go in a .cpp file
 */

#ifdef SPECIALIZED_COMPLEX_PUTTO
#ifdef _LIBCPP_BEGIN_NAMESPACE_STD // for clang++ libs
_LIBCPP_BEGIN_NAMESPACE_STD
#else
namespace std {
#endif
template<>
basic_ostream<char>&
operator<<(basic_ostream<char> & o, const complex<real_t> & x)
{
  basic_ostringstream<char> s;
  s.flags(o.flags());
  s.imbue(o.getloc());
  s.precision(o.precision());
  s << x.real() << std::showpos << x.imag() << 'i';
  return o << s.str();
}
#ifdef _LIBCPP_END_NAMESPACE_STD // for clang++
_LIBCPP_END_NAMESPACE_STD
#else
}
#endif


int main(int argc, char * argv[])
{
  std::complex<real_t> x(1.1,-2.2);
  std::cout << x << "\n";
}

输出

1.1-2.2i

或者,针对本征案例的示例main()

#include <Eigen/Dense>
int main(int argc, char * argv[])
{
  Eigen::Matrix<std::complex<real_t>, 3,3> x;
  Eigen::IOFormat OctaveFmt(Eigen::StreamPrecision, 0, ", ", ";\n", "", "", "[", "]");
  //srand((unsigned int) time(0));
  x.setRandom();
  std::cout << x.format(OctaveFmt) << "\n";
}

以适合复制/粘贴到八度/ matlab的格式输出矩阵:

[  0.680375-0.211234i,  -0.329554+0.536459i, -0.270431+0.0268018i;
    0.566198+0.59688i,   -0.444451+0.10794i,    0.904459+0.83239i;
   0.823295-0.604897i, -0.0452059+0.257742i,   0.271423+0.434594i]

编辑:添加了苹果clang库的宏。