ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C pow异常类型转换

2019-10-03 13:07:26  阅读:188  来源: 互联网

标签:pow c type-conversion


enter image description here当我直接输出std :: pow(10,2)时,我得到100(做长)(pow(10,2))得到99.有人可以解释一下吗?

cout<<pow(10,2)<<endl;
cout<<(long)(pow(10,2))<<endl;

代码基本上是在main函数中.

使用CodeBlocks编译器是mingw32-g .exe -std = c 11
Windows 8.1如果有帮助的话

解决方法:

浮点数是近似值.偶尔你会得到一个可以准确表示的数字,但不要指望它. 100应该是可表示的,但在这种情况下它不是.有些东西注入了近似值,并为每个人毁了它.

从浮点类型转换为整数时,整数不能保存任何小数值,因此会毫不客气地删除它们.没有隐式舍入,分数被丢弃.在99之后,99.9转换为99. 99,有9百万.

因此,在从浮点类型转换为整数之前,将数字四舍五入,然后转换.除非丢弃分数是你想要做的.

cout和大多数输出​​例程,在打印之前礼貌地和无声地舍入浮点值,因此如果有一点近似值,用户就不会对它感到困扰.

这种不精确性也是您不应直接比较浮点值的原因. X可能不完全是pi,但它可能足够接近您的计算,因此您可以使用epsilon(一个软糖因子)进行比较,以判断您是否足够接近.

我发现有趣的,并且花了很多时间试图理清,如果不使用命名空间std,就不会看到这个问题.

(长)pow(10,2)提供100的预期结果.(长)std :: pow(10,2)没有. pow和std :: pow采用的路径从10,2到100之间存在一些差异,结果略有不同.通过将整个std命名空间拉入其文件中,OP意外地将自己射入了脚.

这是为什么?

在文件的顶部我们使用命名空间std;这意味着编译器在查找pow重载时不仅仅考虑双pow(double,double),它还可以调用std :: pow和std :: pow是一个漂亮的小模板,确保在使用除float之外的数据类型调用时加倍正确的转换,一切都是相同的类型.

(long)(pow(10,2))

不匹配

double pow(double, double)

以及它匹配模板实例化

double std::pow(int, int)

哪个,接近我可以告诉我解决的问题

return pow(double(10), double(2));

经过一些模板伏都教.

有什么区别

pow(double(10), double(2))

pow(10, 2)

在调用pow时,从int到double的隐含转换,我不知道.打电话给语言律师,因为这是微妙的.

如果这纯粹是一个舍入问题那么

auto tempa = std::pow(10, 2);

应该是易受攻击的,因为tempa应该正是std :: pow返回的内容

cout << tempa << endl; 
cout << (long) tempa << endl; 

输出应该是

100
99

我明白了

100
100

因此,立即将std :: pow(10,2)的返回转换为long与存储然后转换不同.奇怪的.自动tempa并不完全是std :: pow返回的东西,或者还有其他东西对我来说太深了.

标签:pow,c,type-conversion
来源: https://codeday.me/bug/20191003/1849452.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有