CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

选择程序,我哪里出错了呢?请帮忙~~~~~

楼主jxliang()2005-04-02 23:12:11 在 C/C++ / C++ 语言 提问

#include   <iostream>  
  using   namespace   std;  
   
  void   main()  
  {  
  float   n;  
  int   s;  
   
  for   (;;)  
  {  
  cout<<"input   a   float   number:"<<endl;  
          cin>>n;  
   
          if   (n   ==   3.14)  
  {  
  s   =   0;  
  }  
          else   if   (n   ==   2.72)  
  {  
  s   =   1;  
  }  
          else  
  {  
  s   =   -1;  
  }  
           
  switch(s)  
  {  
          case   0   :   cout<<"This   is   PI"<<endl;   break;  
   
          case   1   :   cout<<"This   is   e"<<endl;   break;  
   
          case   -1   :   cout<<"It   is   not   PI   or   e"<<endl;   break;  
  }  
  }  
  }  
   
  我这个程序到底哪儿出错了呢?   无论我输入什么数据,屏幕都是显示:It   is   not   PI   or   e  
  请大家帮我指正呀~~~  
   
  问题点数:20、回复次数:17Top

1 楼kobefly(科比--网络学习中)回复于 2005-04-02 23:20:25 得分 5

呵呵  
   
  这个问题是由于浮点数是近似存储,而不是精确存储导致的  
   
  比较两个浮点数  
  你应该用一个家精度范围来控制  
  而不是用==  
   
  比如  
   
        if   ((n-   3.14)<0.000001&&(n-   3.14)   >   -0.000001)  
  {  
  s   =   0;  
  }  
          else   if   ((n-   2.72)<0.000001&&(n-   2.72)   >   -0.000001)  
  {  
  s   =   1;  
  }  
          else  
  {  
  s   =   -1;  
  }  
  Top

2 楼bing_huo(我是一个演员!)回复于 2005-04-02 23:23:44 得分 1

(n   ==   3.14)  
  这个有问题   float不能这么比的Top

3 楼bing_huo(我是一个演员!)回复于 2005-04-02 23:24:29 得分 1

晕   慢了。。。楼上正解Top

4 楼jxliang()回复于 2005-04-02 23:25:54 得分 0

哦,是呀,我按照你说的方法改过来后,真的可以正确运行了,谢谢!  
  可是为什么浮点数不能精确存储呢,我不是可以用键盘输入一个精确的实数吗?Top

5 楼kobefly(科比--网络学习中)回复于 2005-04-02 23:36:51 得分 5

计算机是以位存贮的  
   
  象对3开根号,现实中你也不能用一个数来完全精确表示吧  
   
  1   浮点数的一般表示方法  
  在数学中,表示一个浮点数需要三要素:尾数(mantissa)、指数(exponent,又称阶码)和基数(base),都用其第一个字母来表示的话,那么任意一个浮点数N可以表示成下列形式:N=M×BE,例如N1=1.234×10-6,   N2=   -0.001011×2011等,同样的数字对于不同的基数是不相同的,移动小数点的位置,其指数相应地跟着变化。在计算机中,表示一个浮点数,同样需要以上三要素,只是阶码与尾数一同存储,基数常有2、8、16等数值,下面的讨论以2为基数进行。  
  将浮点数放在计算机中存储时,尾数M用定点(Fixed-point)小数的形式,阶码E用有符号整数形式,改变M中小数点的位置,同时需要修改E的值,可以给出有效数字(significant   number)的位数,因此M和E决定了浮点数的精度(precision),E指明小数点在B进制数据中的位置,因而E和B决定了浮点数的表示范围(range),浮点数的符号(Sign)是单独考虑,设阶码有m+1位,尾数有n+1位,则一般浮点数的表示方法如图1所示,其中,下标s代表符号位,下标数字代表数字所处的位数,尾数的小数点默认最高数字位M1之前。图(b)是将尾数的符号位提在最前面,其它部分与图(a)一样,是目前常用的一种表示形式。  
     
  图1   浮点数的一般表示形式  
  在这种表示方法中,阶码的二进制编码(binary   code)一般是原码(sign   magnitude)、补码(twos   complement)或移码(bias),尾数的编码一般是原码或补码。  
  2   浮点数的规格化处理  
  在浮点数系统中,小数点的浮动使数值的表示不能惟一,从而给数据处理带来困难,因此有必要使浮点数的表示与存储有一定的标准,考虑到阶码、尾数之间的关系,常将尾数的最高数字位是有效值的数值称为规格化(normalization),由于尾数可以是原码或补码,所以有两种规格化的形式,如表1所示。  
  表1   规格化数据的形式  
  尾数编码             尾数代码形式             说             明  
            正数             负数              
  原码             0.1×××             1.1×××             最高数治槐匦胛?  
  补码             0.1×××             1.0×××             符号位与最高数字位必须相反  
  对于二进制尾数,规格化限制了其范围是:1/2≤|M|<1,通过左右移动小数点,增减阶码的值来进行规格化处理。  
  在浮点数中,零的表示比较特殊。一个是零浮点数,一般地,对于规格化的浮点数来说,无论阶码为任何值,尾数为零就认为该浮点数是零,但这实际上是由尾数的舍入而近似的值,要让总体浮点数趋近于零,其阶码必须是一个不超出表示范围的最大的负数   才行。设阶码含符号为n位,则整数阶码所表示的范围是:   至   或   至   ,即   是   或   。  
  另一个问题产生于零的唯一表达问题,为了实现用指令测试零,约定在定点数和浮点数格式中零具有相同的表达式,将浮点数的阶码值进行余   编码,就像BCD码中余3码加3一样,阶码被描述为E加上   ,这个   就叫偏移(bias),由上面分析可知   的取值有两种,浮点数的标准表示形式(IEEE754标准)所采用的是   偏移值。  
  3   浮点数的表示范围  
  浮点数的表示有一定的范围,超出范围时会产生溢出(flow),一般称大于绝对值最大的数据为上溢(overflow),小于绝对值最小的数据为下溢(underflow)。浮点数表示范围一般分以下几种情况考虑,设浮点数的阶码和尾数均用补码表示(原码表示比较简单),阶码为m+1位(其中1位是符号),尾数为n+1(其中1位是符号),则浮点数的典型范围值如表2所示。  
  表2   浮点数的典型范围值  
  典型范围             浮点数代码             真     值  
            数符(Ms)             阶码(E)             尾数(M)              
  最大正数  
  最小正数  
  规格化的最小正数  
  绝对值最大的负数  
  绝对值最小的负数  
  规格化的绝对值最小负数             0  
  0  
  0  
  1  
  1  
  1             011…11  
  100…00  
  100…00  
  011…11  
  100…00  
  100…00             11………11  
  00………01  
  10………00  
  00………00  
  11………11  
  01………11                
     
     
     
     
     
   
  4   标准表示法  
  为便于软件的移植,浮点数的表示格式应该有统一标准。1985年IEEE(Institute   of   Electrical   and   Electronics   Engineers)提出了IEEE754标准。该标准规定基数为2,阶码E用移码表示,尾数M用原码表示,根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的一位。实数   的IEEE754标准的浮点数格式为:  
                 
  具体有三种形式:  
  表3     IEEE754三种浮点数的格式参数  
  浮点数  
  类型             存储位数             偏移值(   )  
  阶码E的取值范围             真值表达式  
            数符(s)             阶码(E)             尾数(M)             总位数             十六进制             十进制                          
  短实数             1             8             23             32             7FH             127             1~254                
   
  长实数             1             11             52             64             3FFH             1023             1~2046                
   
  临时实数             1             15             64             80             3FFFH             16383             1~32766                
   
  对于阶码为0或为255(2047)的情况,IEEE有特殊的规定,由于篇幅有限,在此不讨论。  
  在浮点数总位数不变的情况下,其精度值与范围值是矛盾的,因此一般的机器都提供有单、双精度两种格式。表4中列出了IEEE754单精度浮点数的表示范围,对于双精度只需要修改一下偏移值和尾数位数即可。  
  表4     IEEE754单精度、双精度浮点数范围  
  典型范围             浮点数代码             真     值  
            数符(Ms)             阶码(E)             尾数(M)              
  最大正数  
  最小正数  
  绝对值最大的负数  
  绝对值最小的负数             0  
  0  
  1  
  1             11111110  
  00000001  
  11111110  
  00000001             11………11  
  00………00  
  11………11  
  00………00                
     
     
     
   
  标准浮点数的存储格式与图1(b)相似,只是在尾数中隐含存储着一个1,因此在计算尾数的真值时比一般形式要多一个整数1。对于阶码E的存储形式因为是127的偏移,所以在计算其移码时与人们熟悉的128偏移不一样,正数的值比用128偏移求得的少1,负数的值多1,为避免计算错误,方便理解,常将E当成二进制真值进行存储。例如:将数值-0.5按IEEE754单精度格式存储,先将-0.5换成二进制并写成标准形式:-0.510=-0.12=-1.0×2-12,这里s=1,M为全0,E-127=-1,E=12610=011111102,则存储形式为:  
  1   01111110   000000000000000000000000=BE00000016  
  这里不同的下标代表不同的进制。  
  Top

6 楼jxliang()回复于 2005-04-02 23:42:50 得分 0

哗,原来关于浮点数还有这么多学问,真得谢谢kobefly,向你学习呀~~~~Top

7 楼jonnylin()回复于 2005-04-02 23:46:23 得分 1

利害Top

8 楼hzj442(独行侍卫主)回复于 2005-04-02 23:59:54 得分 1

考,可比大哥准备一本书啊??呵呵  
  不过看过一遍真的明白多了  
  Top

9 楼hzj442(独行侍卫主)回复于 2005-04-03 00:10:27 得分 1

你也可以用float只是把n   ==3.14改成n   =='3.14'就行了,呵呵,试试吧,我以前也做过类似的题,觉得这样也行Top

10 楼jxliang()回复于 2005-04-03 00:29:10 得分 0

呵,好,我也试一下Top

11 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-04-03 03:04:21 得分 1

回复人:   kobefly(科比---开始学习c++!)   (   )   信誉:121    
   
  强人!  
  要跟着你学习才行。Top

12 楼jxliang()回复于 2005-04-03 08:19:12 得分 0

试过用float只是把n   ==3.14改成n   =='3.14'了,行不通,而且道理上也说不通呀Top

13 楼mymyal123(风之森)回复于 2005-04-03 09:37:15 得分 1

学习Top

14 楼stevensinclair(游戏_开始)回复于 2005-04-03 10:40:36 得分 1

思考中。  
   
  for   (;;)放在这里干吗?  
  Top

15 楼stevensinclair(游戏_开始)回复于 2005-04-03 10:41:58 得分 1

这样不是相当于while   (1)  
  死循环吗?Top

16 楼jxliang()回复于 2005-04-03 10:45:41 得分 0

对,就是用来作死循环的Top

17 楼ericqxg007(还有很多东西要学(卡卡一米阳光))回复于 2005-04-03 12:08:27 得分 1

没有什么好说的了Top

相关问题

  • 这段JAVA程序哪里出错阿?
  • 分页程序哪里出错了?
  • 程序出错!!!
  • 程序出错
  • 程序出错
  • 很小的入门程序,不知哪里出错?
  • 程序错误?不知道哪里出错!!!!
  • 谁能帮我看下这段程序在哪里出错了
  • 简单C++程序出错,请问哪里错了?【必结贴】
  • 我的程序哪里出错了呀? 求助!!!

关键词

  • cout
  • else

得分解答快速导航

  • 帖主:jxliang
  • kobefly
  • bing_huo
  • bing_huo
  • kobefly
  • jonnylin
  • hzj442
  • hzj442
  • horisly
  • mymyal123
  • stevensinclair
  • stevensinclair
  • ericqxg007

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo