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

Loss of precision when using pow in C++

10^1.64605 = 44.2639330165

但是在 C++ 中使用 pow:

double p = pow(10,1.64605) returns 44.2641. 

这里有办法提高精度吗?我尝试将双方都投射到 long double 但这也没有帮助。

比较有意思的是:

cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;

输出是:

-1.64605
44.2639
44.2641

为什么?

答案将通过检查 p 找到。您没有显示它是如何初始化的。

您会发现 p != a,即使当您将它们打印到控制台时它们看起来是一样的。当您打印到控制台时,您只打印了前 6 位有效的十进制数字。以更高的精度打印这两个值,您会发现它们不相等。

你说的是:

double p = pow(10,1.64605);

的计算结果为 44.2641。但事实并非如此。如果您实际执行该代码,您将看到它。

double p = pow(10,1.64605);
cout << p;

输出44.2639.

您的代码与上面的代码略有不同。它是:

cout << p;
p = pow(10, (-p));
cout << p;

p的原始值输出到全精度,全部显示出来。

cout 正在截断您的双倍显示,但 pow 计算的值可能至少与您预期的一样精确。有关如何在控制台中显示更精确的信息,请参阅:

How do I print a double value with full precision using cout?

鉴于 David 的鼓励,我将详细说明。

您说 double p = pow(10,1.64605) returns 44.2641 但这是不正确的。它 returns 44.26393301653639156;没有任何格式说明符,它显示为 44.2639(稍后会看到)。

当您在第二个代码片段中 cout p 的原始值时,它显示 -1.64605 (由于精度降低 格式化 )并且您假设它 正好是 -1.64605 而它实际上介于 -1.64605115... 和 -1.64605213... 之间,在表达式 cout << pow(10, (-p));

中求值为 44.2641