在C++中使用pow时的精度损失

use*_*557 5 c++ precision pow

10 ^ 1.64605 = 44.2639330165

但是在C++中使用pow:

double p = pow(10,1.64605) returns 44.2641. 
Run Code Online (Sandbox Code Playgroud)

有没有办法提高这里的精度?我尝试将双方都投入long double但是这也没有帮助.

更有趣的是:

cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;
Run Code Online (Sandbox Code Playgroud)

输出是:

-1.64605
44.2639
44.2641
Run Code Online (Sandbox Code Playgroud)

为什么?

Qar*_*tar 7

cout截断你的双倍显示,但计算的值pow可能至少与你期望的一样精确.有关如何在控制台中显示更多精度,请参阅:

如何使用cout以完全精度打印双精度值?

考虑到大卫的推动,我会详细说明.

你说过,double p = pow(10,1.64605) returns 44.2641但这是不正确的.它返回44.26393301653639156; 如果没有任何格式说明符,则显示为44.2639(如稍后所见).

当你cout的原始值p在第二个代码片段则显示-1.64605(由于减少精度格式),并且您假定它准确-1.64605,而它实际上是介于-1.64605115之间...和... -1.64605213,这在表达式中求值为44.2641cout << pow(10, (-p));