zoukankan      html  css  js  c++  java
  • 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 平台下软件开发工具。

  • 相关阅读:
    阿凯
    hlg神秘植物--矩阵快速幂
    poj1185炮兵阵地--状态dp
    该怎么办
    hlg2096---状态压缩dp
    这个世界

    第三篇
    LCT板子
    spoj COT
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3357479.html
Copyright © 2011-2022 走看看