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

C++ C++;11使用pow()和std::complex进行舍入错误,c++,c++11,mingw,std,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; } #包括 #包括 int main() { 配合物Ⅰ(0,1); 标准:

运行以下命令

#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;
}
#包括
#包括
int main()
{
配合物Ⅰ(0,1);
标准::复合成分=功率(i,2);

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

1.22461e-016是

0.0000000000000000122461

工程师会说这是零。你总是会得到这样的变化(除非你坚持对具有相同一般范围的2的幂和进行运算)

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

您提出的一般问题包括以下几个部分: 1.在处理过程中处理浮点数 2.显示泛洪点编号

对于处理,我敢打赌:

comp = i * i ;
会给你想要的

Pow (x, y) is going to do

exp (log (x) * y) 

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

在C++11中,我们有一些新的重载。GCC有两个非标准重载,一个用于提升到
int
,另一个用于提升到
无符号int


一种新的标准重载(即
std::complex-pow(const-std::complex&,const-U&)
)在调用
pow(i,2)
和非标准重载时会产生歧义。它们的解决方案是在
C++11
存在的情况下,将非标准重载清除,然后不再调用专用函数(使用连续平方)到通用方法(使用
pow(double,double)
std::polar
)。

一般来说,浮点数是不精确的。它们在“正确”的误差范围内(epsilon)值。但是,由于0可以显式存储在double中,我怀疑差异与用于创建结果的公式有关。如果将
pow(I,2)
更改为
pow(I,2),是否会看到不同的结果
?这不重要,但我想知道它是否在路径的某个地方为
pow
选择了不正确的重载,这在C++11中获得了几个新的重载。最佳做法是确定精度(以位数为单位)在输出数字时,将数字四舍五入到该精度……浮点始终是一种近似值,因此在处理它们时不应考虑相等。我对您的具体情况的猜测是,编译器在默认情况下使用的stdlib实现的特殊情况是指数
2
或基
(0,1)
而C++11实现没有。我正在删除qt标记,因为它似乎不是一个qt问题。我也发现,
std::pow()
的重载以一种回归的方式发生了变化,这让我非常恼火:
std::pow(double,int)例如,
已经不存在了。我认为,论点是,使用连续平方的实现只对小指数更有效。顺便说一句,我使用我自己的简单(模板化)
square(x)
而不是
pow(x,2)
。你完全忽略了我认为问题中最有趣的部分,为什么在为C++11配置时答案会发生变化?只需在运行时库或代码生成中稍做更改,就可以生成与浮点结果相差千万分之一的结果。我知道这一点,还有成千上万的其他原因这个网站上的问题抱怨浮点不准确。如果这个问题没有新的问题,我会投票将其作为副本关闭。这不是浮点不准确;这是浮点精度。也许你的编译器支持长双精度类型,你可以提高精度。谢谢你的回答,很高兴知道这一点这是一个额外的编译器特性,使它在没有新标准的情况下工作!