为什么pw(n,2)在n=5时用我的编译器和操作系统返回24?

为什么pw(n,2)在n=5时用我的编译器和操作系统返回24?

#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){
    int n,i,ele;
    n=5;
    ele=pow(n,2);
    printf("%d",ele);
    return 0;}

输出是24.

我在代码:块中使用GNU/GCC。

怎么回事?

我知道pow函数返回double,但是25适合于int类型,所以为什么这段代码会打印24而不是25?如果n=4; n=6; n=3; n=2;代码起作用了,但对五种情况却不起作用。


慕少森
浏览 484回答 3
3回答

慕慕森

您希望从用于双倍的函数得到int结果。你也许应该用ele=(int)(0.5&nbsp;+&nbsp;pow(n,2));/*&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*//*&nbsp;casting&nbsp;and&nbsp;rounding&nbsp;&nbsp;&nbsp;*/

拉丁的传说

浮点算法不精确.虽然可以精确地添加和减去较小的值,但pow()函数通常通过乘以对数来工作,所以即使输入都是精确的,结果也不是。指派给int总是截断,所以如果不准确是负的,你将得到24,而不是25。这个故事的寓意是对整数使用整数运算,并对<math.h>函数,当实际参数被提升或截断时。不幸的是,GCC没有发出警告,除非你补充-Wfloat-conversion(它不在里面-Wall -Wextra,可能是因为在许多情况下,这种转换是预期的和需要的)。对于整数幂,使用乘法(除法如果是负数)总是更安全、更快,而不是pow()-把后者保留在需要的地方!不过,一定要注意溢出的风险。
打开App,查看更多内容
随时随地看视频慕课网APP