设为首页 加入收藏

TOP

C语言陷阱:浮点运算
2013-10-14 09:01:08 来源: 作者: 【 】 浏览:257
Tags:语言 陷阱 浮点 运算

  在Stack overflow上看到这样一个问题。

  计算如下表达式的值:

  P=(1/2-3/4)*(5/6-7/8)*…*[n/(n-1) - (n+2)/(n+3)].

  程序如下:

  #include <stdio.h>

  int main ()

  {

  float s, p = 1.0;

  int i, n;

  printf("Put a number:");

  scanf("%d", &n);

  for (i = 1; i <= n; ++i) {

  p *= ((i)/(i+1)-(i+2)/(i+3));

  }

  printf("\n p=%f", p);

  }

  运行之后不管n为何值,p的值都输出为0,为什么?

  初看好像程序没什么问题,但仔细想一下发现计算p的表达式p *= ((i)/(i+1)-(i+2)/(i+3))中的i是int型变量,对于i>=1,(i)/(i+1)永远都为0.

  所以表达式应该修改为:p *= ((float)(i)/(i+1)-(float)(i+2)/(i+3));

  或者 p *= ((i)/(i+1.0)-(i+2.0)/(i+3.0)。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中基础小问题总结 下一篇1.1.1 Red Hat Linux

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: