Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么cmath pow给出的答案不准确?_C++_C++11_Cmath - Fatal编程技术网

C++ 为什么cmath pow给出的答案不准确?

C++ 为什么cmath pow给出的答案不准确?,c++,c++11,cmath,C++,C++11,Cmath,在C++11中: pow(1061,6); // = 1426567426713180416 检查最后3位数字。 我确信这个结果是错误的,因为1061^6=1426567426713180361 但另一种方法是正确的: long a =1; for(int i=0; i<6 ; i++){ a*=1061; } cout << a; // = 1426567426713180361 长a=1; 对于(int i=0;ipow使用double作为其输出,其精度约

在C++11中:

pow(1061,6);   // = 1426567426713180416
检查最后3位数字。 我确信这个结果是错误的,因为1061^6=1426567426713180361

但另一种方法是正确的:

long a =1;    
for(int i=0; i<6 ; i++){ a*=1061; }
cout << a;  // = 1426567426713180361
长a=1;

对于(int i=0;i
pow
使用
double
作为其输出,其精度约为16位小数。但是,64位
长的
有19位。

std::pow
工作于
double
s。对于如此大的整数值,它不能像整数算法那样保持结果数的精度.

将返回整数情况下的double,这解释了第一个整数,其中double不能再精确地表示从
9007199254740993开始的每个整数。
之后,我们可能会有不能精确表示为double的整数

我们可以更容易地看到这一点,因为使用统一初始化时,缩小转换的格式不正确。使用您希望的结果,我们可以看到:

double d2{1426567426713180361};
是缩小转换()

因为它不能精确表示。我们还可以看到,前面的数字也是一个缩小的转换:

double d1{9007199254740993} ;
而:

double d3{1426567426713180416};
事实并非如此

double d3{1426567426713180416};