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

Loss of precision when using pow in C++

本文关键字:精度 损失 pow C++      更新时间:2023-10-16

>10^1.64605 = 44.2639330165

但是,在使用pow C++

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

为什么?

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.2641 cout << pow(10, (-p));

答案将通过检查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的原始值输出到全精度,所有内容都将显示出来。