C++ 为什么cmath pow给出的答案不准确?
在C++11中: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作为其输出,其精度约
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
作为其输出,其精度约为16位小数。但是,64位长的有19位。std::pow
工作于double
s。对于如此大的整数值,它不能像整数算法那样保持结果数的精度.将返回整数情况下的double,这解释了第一个整数,其中double不能再精确地表示从9007199254740993开始的每个整数。
之后,我们可能会有不能精确表示为double的整数
我们可以更容易地看到这一点,因为使用统一初始化时,缩小转换的格式不正确。使用您希望的结果,我们可以看到:
double d2{1426567426713180361};
是缩小转换()
因为它不能精确表示。我们还可以看到,前面的数字也是一个缩小的转换:
double d1{9007199254740993} ;
而:
double d3{1426567426713180416};
事实并非如此
double d3{1426567426713180416};