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

jxliang 2005-04-02 11:12:11
#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
请大家帮我指正呀~~~

...全文
151 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxliang 2005-04-03
  • 打赏
  • 举报
回复
呵,好,我也试一下
hzj442 2005-04-03
  • 打赏
  • 举报
回复
你也可以用float只是把n ==3.14改成n =='3.14'就行了,呵呵,试试吧,我以前也做过类似的题,觉得这样也行
ericqxg007 2005-04-03
  • 打赏
  • 举报
回复
没有什么好说的了
jxliang 2005-04-03
  • 打赏
  • 举报
回复
对,就是用来作死循环的
stevensinclair 2005-04-03
  • 打赏
  • 举报
回复
这样不是相当于while (1)
死循环吗?
stevensinclair 2005-04-03
  • 打赏
  • 举报
回复
思考中。

for (;;)放在这里干吗?
mymyal123 2005-04-03
  • 打赏
  • 举报
回复
学习
jxliang 2005-04-03
  • 打赏
  • 举报
回复
试过用float只是把n ==3.14改成n =='3.14'了,行不通,而且道理上也说不通呀
horisly 2005-04-03
  • 打赏
  • 举报
回复
回复人: kobefly(科比---开始学习c++!) ( ) 信誉:121

强人!
要跟着你学习才行。
hzj442 2005-04-02
  • 打赏
  • 举报
回复
考,可比大哥准备一本书啊??呵呵
不过看过一遍真的明白多了
jonnylin 2005-04-02
  • 打赏
  • 举报
回复
利害
jxliang 2005-04-02
  • 打赏
  • 举报
回复
哗,原来关于浮点数还有这么多学问,真得谢谢kobefly,向你学习呀~~~~
kobefly 2005-04-02
  • 打赏
  • 举报
回复
计算机是以位存贮的

象对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
这里不同的下标代表不同的进制。
jxliang 2005-04-02
  • 打赏
  • 举报
回复
哦,是呀,我按照你说的方法改过来后,真的可以正确运行了,谢谢!
可是为什么浮点数不能精确存储呢,我不是可以用键盘输入一个精确的实数吗?
bing_huo 2005-04-02
  • 打赏
  • 举报
回复
晕 慢了。。。楼上正解
bing_huo 2005-04-02
  • 打赏
  • 举报
回复
(n == 3.14)
这个有问题 float不能这么比的
kobefly 2005-04-02
  • 打赏
  • 举报
回复
呵呵

这个问题是由于浮点数是近似存储,而不是精确存储导致的

比较两个浮点数
你应该用一个家精度范围来控制
而不是用==

比如

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;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧