首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中使用pow时精度损失

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

Stack Overflow用户
提问于 2015-04-22 03:31:25
回答 2查看 2.8K关注 0票数 5

10^1.64605 = 44.2639330165

然而,在C++中使用pow

代码语言:javascript
运行
复制
double p = pow(10,1.64605) returns 44.2641. 

这里有提高精度的方法吗?我试着把两边都投给long double,但这也没什么帮助。

更有趣的是:

代码语言:javascript
运行
复制
cout<<p;
double a = -1.64605;
cout<<pow(10,-a);
p = pow(10, (-p));
cout<<p;

产出如下:

代码语言:javascript
运行
复制
-1.64605
44.2639
44.2641

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-22 05:56:08

cout正在截断双面以供显示,但是由pow计算的值可能至少与您预期的一样精确。有关如何在控制台中获得更高的精度,请参见:

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

考虑到大卫的催促,我会详细说明的。

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

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

票数 7
EN

Stack Overflow用户

发布于 2015-04-22 05:49:48

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

您会发现这个p != a,尽管当您将它们打印到控制台时,它们看起来是相同的。当您打印到控制台时,您只打印前6个有效小数位数。以更高的精度打印两个值,您将看到它们是不相等的。

你说过:

代码语言:javascript
运行
复制
double p = pow(10,1.64605);

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

代码语言:javascript
运行
复制
double p = pow(10,1.64605);
cout << p;

输出44.2639

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

代码语言:javascript
运行
复制
cout << p;
p = pow(10, (-p));
cout << p;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29787202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档