c++ - C++ POW异常类型转换-LMLPHP当我直接输出std :: pow(10,2)时,我在做(long)(pow(10,2))给出99时得到100。有人可以解释一下吗?

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


主要功能中的代码基本上就是这个。

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

最佳答案

浮点数是近似值。有时您会得到一个可以准确表示的数字,但不要指望它。 100应该可以表示,但在这种情况下不是。某种东西注入了一个近似值,并毁了所有人。

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

因此,在从浮点类型转换为整数之前,将数字四舍五入,然后进行转换。除非要丢弃分数,否则您要这样做。

cout和大多数输出​​例程在打印前都会有礼貌地以静默方式对浮点值进行舍入,因此,如果有一些近似值,那么用户就不会感到烦恼。

这种不精确性也是为什么您不应该直接比较浮点值的原因。 X可能不完全是pi,但是对于您的计算而言可能足够接近,因此您可以使用epsilon(一种软化因子)进行比较,以判断您是否足够接近。

我觉得很有趣,并且花了很多时间试图弄清楚,如果不是using namespace std;的话,甚至根本不会看到这个问题。

(long)pow(10,2)提供100的预期结果。(long)std::pow(10,2)不提供。 powstd::pow在从10,2到100的路径上有些差异会导致结果略有不同。通过将整个std命名空间放入其文件中,OP意外地将自己击倒。

这是为什么?

在文件的顶部,我们有using namespace std;,这意味着编译器在查找double pow(double, double)重载时不仅考虑pow,还可以调用std::pow,并且std::pow是一个漂亮的小模板,可确保当使用除float和double以外的数据类型调用时,将进行正确的转换,并且所有内容都是同一类型。

(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)


我不知道从intdouble的隐式转换是对pow的调用。打电话给语言律师,因为这有些微妙。

如果这纯粹是一个四舍五入的问题,那么

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


应该容易受到攻击,因为速度应该恰好是std::pow返回的值

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


并且输出应该是

100
99


我懂了

100
100


因此,立即将std::pow(10, 2)的返回值强制转换为long不同于存储然后强制转换。奇怪的。 auto tempa并不完全是std::pow返回的内容,或者有其他事情对我来说太深了。

关于c++ - C++ POW异常类型转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33187956/

10-08 22:24
查看更多