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

时间:2014-04-11 18:07:01

标签: c++ c++11 mingw std

运行以下

#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;
}

给出了没有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。

2 个答案:

答案 0 :(得分:5)

在C ++ 11中,我们有一些pow(std::complex)的新重载。 GCC有两个非标准的重载,一个用于提升到int,另一个用于提升到unsigned int

新标准重载之一(即std::complex</*Promoted*/> pow(const std::complex<T> &, const U &))在使用非标准重载调用pow(i, 2)时会导致歧义。他们的解决方案是在#ifdef出现时将C++11非标准的解析出来,然后从调用专用函数(使用连续平方)到泛型方法(使用pow(double,double))和std::polar)。

答案 1 :(得分:0)

使用浮点数时,需要进入不同的模式。浮点数是实数的近似值。

1.22461e-016是

0.0000000000000000122461

工程师会说IS为零。你将永远得到这样的变化(除非你坚持使用相同的一般范围的2的幂的总和。

简单的值0.1不能用浮点数精确表示。

您提出的一般问题包括: 1.处理处理中的浮点数 2.显示洪水点数。

对于处理,我会打赌这样做:

comp = i * i ;

会让你想要你想要的。

Pow (x, y) is going to do

exp (log (x) * y) 

对于输出,切换到使用F格式。