博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言陷阱:浮点运算
阅读量:4362 次
发布时间:2019-06-07

本文共 827 字,大约阅读时间需要 2 分钟。

 

    在Stack overflow上看到这样一个问题。
  计算如下表达式的值:
  P=(1/2-3/4)*(5/6-7/8)*…*[n/(n-1) - (n+2)/(n+3)].
  程序如下:
 

1  #include
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("\n 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 平台下系统开发,熟悉TCP\IP协议及相关应用,掌握socket TCP.LDP网络编程,熟悉C语言,熟练使用Linux操作系统,熟练使用Linux 平台下软件开发工具。

转载于:https://www.cnblogs.com/Zblogs/p/3357479.html

你可能感兴趣的文章
禅道项目管理系统整合Selenium IDE的思路
查看>>
Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
查看>>
linux-nohup命令
查看>>
[LeetCode OJ] Roman to Integer
查看>>
三次握手和四次挥手
查看>>
Redis的简单动态字符串实现
查看>>
putty network error:software caused connection abort
查看>>
存储过程 <3> 和函数的区别
查看>>
高级service之ipc ADIL用法
查看>>
Django框架-基础篇
查看>>
Leetcode: Binary Tree Maximum Path Sum
查看>>
通过虚拟环境创建并开始一个django
查看>>
关于 input[type="button"] , button
查看>>
Android ViewDragHelper全然解析 自己定义ViewGroup神器
查看>>
c++ 基础 const char* 转 char*
查看>>
JS-- 小细节--你悟到了什么?
查看>>
收款 借贷
查看>>
Gson关于抽象类的序列化与反序列化
查看>>
Java面向对象之类和对象
查看>>
Oracle数据库提权(dba权限执行系统命令)
查看>>