运行以下
#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。
答案 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格式。