• 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 平台下软件开发工具。

  • 相关阅读:
    userdir 希望用户能够以http://X.X.X.X/~username 方式来访问自己的网页
    var_export() 函数的使用
    mb_detect_encoding — 检测字符的编码
    详解PHP fsockopen的使用方法
    jQuery 返回顶部
    Mysql函数
    sql where 1=1和 0=1 的作用
    Numpy基础学习(三)
    Numpy 中的矩阵
    Numpy数组的全通用函数
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3357479.html
Copyright © 2020-2023  润新知