Function pow() int C++

Function pow() int C++

本文关键字:int C++ pow Function      更新时间:2023-10-16

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

int x = 3;
x = x * pow(67, 1);
printf("%dn", x);

->200

谁能帮我解释一下吗?谢谢!

初步解释:以双精度执行的pow函数不"理解"1的幂表示"返回确切的数字",并返回66.9999。(很多9分,但不完全是67分(。3的乘积大约是200.99997。最后,由于该结果被分配给int,因此它被向下取整(截断(为200。

pow(67,1)不应编译为C++03,但正如Tony在评论中所观察到的,1C++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,但幂运算不能保证产生精确的整数。例如,它可以被执行为an=En*ln(a(

因此,该结果可以稍微大于或小于精确的67。

乘法表达式精确地将整数3转换为double,并且乘法作为double执行。如果pow的结果小于67,那么你会得到像200.9999999...这样的结果,如果它比你得到的201.0精确,如果它稍微多一些,那么你就会得到类似201.0000001...的结果。

最后,返回到x的赋值将返回的向下转换为最接近的int值,在第一种情况下为200,在第二种和第三种情况下则为201。

2

我只能得出结论,声称的结果200一定(很可能(是不正确的;它被错误地报告了


1(C++11§26.8/11:“此外,应存在足够的额外过载,以确保:1。如果与double参数相对应的任何参数具有类型long double,则与double参数相对应地所有参数都被有效地强制转换为long double。2.否则,如果与double参数对应的任何参数具有类型double或整数类型,则与double参数对应的所有参数都被有效地强制转换为double。3.否则,与double参数相对应的所有自变量都被有效地强制转换为float&">
2(请参阅已删除文本的注释