函数pow()int C ++

时间:2014-05-26 02:45:35

标签: c++ c types

当我尝试乘以整数3 pow(67,1)时,我遇到了问题。它返回200而不是201.这是我在C中的代码:

int x = 3;
x = x * pow(67, 1);
printf("%d\n", x);

- > 200

任何人都可以为我解释。谢谢!

2 个答案:

答案 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中,参数转换为doublepow执行取幂。虽然这些数字可以精确地表示为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。“。
2)见删除文本的评论。

答案 1 :(得分:3)

暂定解释:pow函数以双精度执行,并不“理解”1的幂表示“返回确切的数字”并返回66.9999。 (很多9个但不完全是67个)。乘以3得到200.99997。最后,由于结果已分配给int,因此将其向下舍入(截断)为200。