使用pow()和std :: complex的C++ 11舍入错误

Sch*_*aki 4 c++ mingw std c++11

运行以下

#include <iostream>
#include <complex>

int main()
{
  std::complex<double> i (0,1);
  std::complex<double> comp =pow(i, 2  );
  std::cout<<comp<<std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出了没有c ++ 11的预期结果(-1,0).但是,使用c ++ 11进行编译会产生极其烦人的问题(-1,1.22461e-016).

怎么做,什么是最佳做法?

当然,这可以通过地板等手动修复,但我很高兴知道解决问题的正确方法.

SYSTEM:Win8.1,使用Desktop Qt 5.1.1(Qt Creator)和MinGW 4.8 32位.通过在Qt Creator .pro文件中添加标志QMAKE_CXXFLAGS + = -std = c ++ 11来使用c ++ 11.

Sir*_*Guy 5

在C++ 11中,我们有一些新的重载pow(std::complex).海湾合作委员会有两个非标准的超载,一个用于筹集到一个int,一个用于筹集到一个unsigned int.

其中一个新的标准重载(即std::complex</*Promoted*/> pow(const std::complex<T> &, const U &))在使用非标准重载时会导致歧义pow(i, 2).他们的解决方案是#ifdef在存在的情况下对非标准的解决方案C++11,你从调用专用函数(使用连续的平方)到泛型方法(使用pow(double,double)std::polar).