为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C C++
慕少森 2019-06-20 10:26: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;代码起作用了,但对五种情况却不起作用。
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

您希望从用于双倍的函数得到int结果。

你也许应该用

ele=(int)(0.5 + pow(n,2));/*    ^    ^              *//* casting and rounding   */


查看完整回答
反对 回复 2019-06-20
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

浮点算法不精确.

虽然可以精确地添加和减去较小的值,但pow()函数通常通过乘以对数来工作,所以即使输入都是精确的,结果也不是。指派给int总是截断,所以如果不准确是负的,你将得到24,而不是25。

这个故事的寓意是对整数使用整数运算,并对<math.h>函数,当实际参数被提升或截断时。不幸的是,GCC没有发出警告,除非你补充-Wfloat-conversion(它不在里面-Wall -Wextra,可能是因为在许多情况下,这种转换是预期的和需要的)。

对于整数幂,使用乘法(除法如果是负数)总是更安全、更快,而不是pow()-把后者保留在需要的地方!不过,一定要注意溢出的风险。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 483 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信