当我尝试乘以整数3 pow(67,1)时,我遇到了问题。它返回200而不是201.这是我在C中的代码:
int x = 3;
x = x * pow(67, 1);
printf("%d\n", x);
- > 200
任何人都可以为我解释。谢谢!
答案 0 :(得分:3)
pow(67,1)
不应编译为C ++ 03 ,但正如Tony在评论中所观察到的那样, 1 C ++ 11的§26.8/ 11使其成为可能在C ++ 11中再次有效。 Visual C ++ 12.0拒绝代码为C ++,显然是按C ++ 03规则播放。但是,g ++编译器版本4.8.2接受代码。使用Visual C ++,可以获得有关模糊调用的诊断,因为存在许多重载。
在C或C ++ 11中,参数转换为double
,pow
执行取幂。虽然这些数字可以精确地表示为double
,但是取幂操作不能保证产生精确的整数。例如。它可以作为 n = e n * ln(a)执行。
因此结果可能略高于或低于67。
乘法表达式将整数3精确地转换为double
,并且乘法执行为double
。如果pow
结果小于67,那么您会得到200.9999999...
之类的结果,如果它与您获得201.0
的结果完全相同,如果结果略高于201.0000001...
}。
最后,分配回x
会将 down 转换为最接近的int
值,在第一种情况下为200,在第二种和第三种情况下为201
2 我只能得出结论,声称的结果200必须(很可能)是不正确的;它是错误报告的。
<小时/> 1) C ++11§26.8/ 11:“此外,应该有足够的额外重载来确保:1。如果对应于
double
参数的任何参数具有类型{ {1}},然后与long double
参数对应的所有参数都有效地转换为double
。 2.否则,如果对应于long double
参数的任何参数具有类型double
或整数类型,则与double
参数对应的所有参数都有效地转换为double
。 3.否则,与double
参数对应的所有参数都有效地转换为double
。“。
答案 1 :(得分:3)
暂定解释:pow
函数以双精度执行,并不“理解”1的幂表示“返回确切的数字”并返回66.9999。 (很多9个但不完全是67个)。乘以3得到200.99997。最后,由于结果已分配给int
,因此将其向下舍入(截断)为200。