当我直接输出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)
不提供。 pow
和std::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)
我不知道从
int
到double
的隐式转换是对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/