奇怪的战俘(x,y); 行为

Soa*_*Cro 4 c++ pow

在做我的作业时,我注意到一些非常奇怪的东西,我无法弄清楚为什么.

int x = 5;
cout << pow(x, 2);
Run Code Online (Sandbox Code Playgroud)

结果是25.那没关系.但如果我写这样的程序:

int x = 5;
int y = pow(x, 2);
cout << y;
Run Code Online (Sandbox Code Playgroud)

结果是24!

当x为2,3,4,6,7,8没有问题,但是5,10,11,13等结果比它应该低1.

if()也是一样的.

for (int x = 1; x <= 20 ; x++) {
    if (x * x == pow(x, 2)) 
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

它打印出数字1,2,3,4,6,8,12,16.

jue*_*n d 10

std::pow()返回浮点数.例如24.99999999,如果结果是你并将其投射到int,那么它将被切断为 24.

这就是你在第二个代码示例中所做的.在第一个代码示例
cout中没有转换int并输出正确的结果.


Dhr*_*hak 6

'pow'返回一个double值,而不是int.当转换为int时,double值会被截断.

http://www.cplusplus.com/reference/cmath/pow/

不建议将double与int进行比较.

http://www.cplusplus.com/reference/cmath/pow/

对您的代码进行次要编辑:

int x = 5;
double y = pow(x,2);   // correct datatype
cout << y;
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 5

战俘功能可与floatdouble,而不是整数.将此值分配给整数时,该值可能会被截断,因为浮点数据的表示中存在精度问题.

我建议阅读科学家应该知道的关于浮点算术的内容,因为这描述了为什么你会看到这种行为.

话虽如此,如果您使用double值而不是int,您可能会看到您期望的结果.

  • @uʍopǝpısdn嗯,是的,不是 - 我认为理解**为什么**这种情况发生是很重要的,因为这样可以防止OP后来被混淆,并导致整体习惯更好. (2认同)