C语言陷阱:浮点运算

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

  计算如下表达式的值:

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

  程序如下:

 

 1  #include<stdio.h>
 2 
 3   int main ()
 4 
 5   {
 6 
 7   float s, p = 1.0;
 8 
 9   int i, n;
10 
11   printf("Put a number:");
12 
13   scanf("%d", &n);
14 
15   for (i = 1; i <= n; i=i+4) {
16 
17   p *= ((i)/(i+1)-(i+2)/(i+3));
18 
19   }
20 
21   printf("
 p=%f", p);
22 
23   }


  运行之后不管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++语言的老师说:来博洋的孩子们都是年轻的一代,可不能老糊涂哦!
    博洋教育C++培训教师简介:吴耀,C语言讲师

    技术特点:掌握Linux 平台下系统开发,熟悉TCPIP协议及相关应用,掌握socket TCP.LDP网络编程,熟悉C语言,熟练使用Linux操作系统,熟练使用Linux 平台下软件开发工具。

原文地址:https://www.cnblogs.com/Zblogs/p/3357479.html