C语言陷阱:浮点运算

2013-10-14 09:01:08 · 作者: · 浏览: 261

  在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)。