请问下面这一段关于三菱plc浮点数运算的运算意义到底是什么

1.请问处理器的浮点运算和主频的关系是什么?
2.一个处理器的二级缓存大小和速度和浮点运算多大关系?
3.是否浮点运算能力高其科学计算能力也高?
在回答你的问题之前,我所能告诉你的就是。你对这几个概念根本不了解。
浮点运算是指浮点数之间的运算,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。一个相关信息的浮点能力是估计其内部结构来的。但是主频作为CPU内的数据处理单元,肯定是有影响的。
就浮点运算能力来看,奔四处理器中只有2个浮点执行单元,而其中一个单元要同时处理FADD,FMUL,MMX。SSE和SSE2,它的浮点运算完全取决于SSE的优化,所以奔四处理器的浮点单元设计应该是整个处理器设计中最薄弱的部分。AMD则为Athlon Xp设计了3个并行的浮点、多媒体执行单元。其中一个是浮点的存储,一个是浮点加,一个是浮点乘,其中浮点加和浮点乘是分开的。所以Athlon中就有两个并行的浮点通道,三个执行单元,而且相互之间完全不受干扰,这是所谓的超标量的浮点结构。
所以我能在你的一个个问题给出的答案是,有关系。
但是我这里说的没有关系是指
第二个问题是,直接关联。
一个计算机的浮点数据和浮点运算指令几乎全部来自于二级缓存。
第3个问题答案是NO!
电脑里面一个浮点指令和整点处理指令是分开的...
在回答你的问题之前,我所能告诉你的就是。你对这几个概念根本不了解。
浮点运算是指浮点数之间的运算,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。一个相关信息的浮点能力是估计其内部结构来的。但是主频作为CPU内的数据处理单元,肯定是有影响的。
就浮点运算能力来看,奔四处理器中只有2个浮点执行单元,而其中一个单元要同时处理FADD,FMUL,MMX。SSE和SSE2,它的浮点运算完全取决于SSE的优化,所以奔四处理器的浮点单元设计应该是整个处理器设计中最薄弱的部分。AMD则为Athlon Xp设计了3个并行的浮点、多媒体执行单元。其中一个是浮点的存储,一个是浮点加,一个是浮点乘,其中浮点加和浮点乘是分开的。所以Athlon中就有两个并行的浮点通道,三个执行单元,而且相互之间完全不受干扰,这是所谓的超标量的浮点结构。
所以我能在你的一个个问题给出的答案是,有关系。
但是我这里说的没有关系是指
第二个问题是,直接关联。
一个计算机的浮点数据和浮点运算指令几乎全部来自于二级缓存。
第3个问题答案是NO!
电脑里面一个浮点指令和整点处理指令是分开的。
从上面的分析不难看出,当频率相关不大时,Athlon Xp的浮点运算能力比奔四处理器要好,那么这对于消费者有什么参考价值呢?浮点运算能力强的的处理器,对于游戏应用及三维处理比较有利,例如3DMAX,MAYA等三维设计软件就对CPU的浮点运算能力要求很高多媒体指令:
MMX可谓是电脑最早加入到586的多媒体指令集,后来在此基础上,英特尔开发了SSE指令集及现在的SSE2。而同时,AMD开发了与SSE兼容的增强3D Now!指令集,从指令集来看,英特尔的处理器由于具备SSE2,因此从功能上来看稍胜一筹。同时,由于很多软件都针对SS2进行了优化,因此在很多多媒体软件及平面处理软件中,英特尔的奔四及赛扬处理器由于具备SS2,因此性能相对比同档次的AMD处理器好。
其他答案(共1个回答)
和内存之间的一个空间,高速的存储数据,与运算有很大联系。
浮点运算能力越高,运算的精确性就越高,也可以象你那样说。
浮点数是表示小数的一种方法。所谓浮点就是小数点的位置不固定,与此相反有定点数,即小数点的位置固定。整数可以看做是一种特殊的定点数,即小数点在末尾。8086/80...
当我们用不同的电脑计算圆周率时,会发现一台电脑的计算较另一台来讲结果更加精确。或者我们在进行枪战游戏的时候,当一粒子弹击中墙壁时,墙上剥落下一块墙皮,同样的场面...
就是带小数点的数字,进行运算
可以确切的说是AMD的更好,如果单从cpu的一些参数指标来看,大差不差,多媒体指令集的支持方面也旗鼓相当,但是AMD之所以在游戏方面见长,是因为其更强的浮点运算...
可以查查这方面的相关书籍
答: 去网上查查
答: 它的作用是在优化网络服务的基础上,为源主机和目标主机之间提供可靠的价格合理的透明数据传输,使高层服务用户在相互通信时不必关心通信子网实现的细节
答: 打10060找网通维修
根本就没有正式的国际驾照,如果到国外开车,正式的程序:
1、到公证处办理驾照的公证书,可以要求英文或者法文译本(看看到哪个国家而定);
2、拿公证书到外交部的领事司指定的地点办理“领事认证”,可以登录外交部网站查询,北京有4、5家代办的,在外交部南街的京华豪园2楼或者中旅都可以。
3、认证后在公证书上面贴一个大标志;
4、有的国家还要到大使馆或者领事馆盖章一下。
偶前几天刚刚办过。
目前我们的生活水平必竟非同以往.吃得好休息得好,能量消耗慢,食欲比较旺盛,活动又少,不知不觉脂肪堆积开始胖啦。                                                                                         减肥诀窍:一.注意调整生活习惯,二。科学合理饮食结构,三。坚持不懈适量运动。
   具体说来:不要暴饮暴食。宜细嚼慢咽。忌辛辣油腻,清淡为好。多喝水,多吃脆平果青香焦,芹菜,冬瓜,黄瓜,罗卜,番茄,既助减肥,又益养颜,两全其美!
有减肥史或顽固型症状则需经药物治疗.
如有其他问题,请发电子邮件:jiaoaozihao53@ .或新浪QQ: 1
关于三国武将的排名在玩家中颇有争论,其实真正熟读三国的人应该知道关于三国武将的排名早有定论,头十位依次为:
头吕(吕布)二赵(赵云)三典韦,四关(关羽)五许(许楮)六张飞,七马(马超)八颜(颜良)九文丑,老将黄忠排末位。
关于这个排名大家最具疑问的恐怕是关羽了,这里我给大家细细道来。赵云就不用多说了,魏军中七进七出不说武功,体力也是超强了。而枪法有六和之说,赵云占了个气,也就是枪法的鼻祖了,其武学造诣可见一斑。至于典韦,单凭他和许楮两人就能战住吕布,武功应该比三英中的关羽要强吧。
其实单论武功除吕布外大家都差不多。论战功关羽斩颜良是因为颜良抢军马已经得手正在后撤,并不想与人交手,没想到赤兔马快,被从后背赶上斩之;文丑就更冤了,他是受了委托来招降关羽的,并没想着交手,结果话没说完关羽的刀就到了。只是由于过去封建统治者的需要后来将关羽神话化了,就连日本人也很崇拜他,只不过在日本的关公形象是扎着日式头巾的。
张飞、许楮、马超的排名比较有意思,按理说他们斗得势均力敌都没分出上下,而古人的解释是按照他们谁先脱的衣服谁就厉害!有点搞笑呦。十名以后的排名笔者忘记了,好象第11个是张辽。最后需要说明的是我们现在通常看到的《三国演义》已是多次修改过的版本,笔者看过一套更早的版本,有些细节不太一样。
要有经营场所,办理工商登记(办理卫生许可),如果觉得有必要还要到税务局买定额发票,不过奶茶店一般人家消费是不会要发票的巴,要买设备,要联系供应商备一些原料,就好啦,没啥难的,不过要赚钱的话就得选好开店地段。
办理手续的程序(申领个体执照):
1、前往工商所申请办理
2、根据工商所通知(申请办理当场就会给你个小纸条)前往办理名称预核
3、拿到名称预核通知书,办理卫生许可证(前往所在地卫生监督所办理)
4、拿着名称预核通知书和卫生许可证前往工商所核发营业执照。
婴儿2-3个月时的吮手是一种暂时性的现象,它随着婴儿由口唇快感期转向肛门快感期,手的功能随年月的增长,会向探求性功能方向发展,他会自然而然地将自己的小手从吮吸中解放出来,会以更大的兴趣去触摸周围各种物体和多种多样的玩具,这为智能开发开辟了新天地。
正常宝宝出生后4个月,在成人扶持下可短时间维持坐的姿势;6个月时能抱坐于大人膝盖之上,如独立坐着,身体会向前倾,须用手支撑;大约7个月时,才能独立地坐一会儿。宝宝坐得过早过晚都不好。妈妈可以先与宝宝玩“引拉游戏”。即让宝宝仰卧在床上,妈妈面对宝宝,一边和宝宝说:“妈妈帮你坐起来玩好吗?”一边慢慢用双手拉其胳膊,拉至坐姿后,将其扶直,稍坐片刻后,再帮助仰卧床上,反复进行3~6次。也可以让宝宝靠着沙发背坐或靠在妈妈胸前坐来进行靠坐练习,还可以在地毯上用几个大垫子围成一个三角形让宝宝靠坐在其中。刚开始训练坐时,宝宝经常会左右摇摆或身子前倾,此时妈妈可教他用双手在前支撑一下。
给宝宝选用水果时,要注意与体质、身体状况相宜。舌苔厚、便秘、体质偏热的宝宝,最好给吃寒凉性水果,如梨、西瓜、香蕉、猕猴桃、芒果等,它们可以败火;秋冬季节宝宝患急慢性气管炎时,吃柑橘可疏通经络,消除痰积,因此有助于治疗。但柑橘不能过多食用,如果吃多了,会引宝宝上火,每天给宝宝吃二到三个即要打住;当宝宝缺乏维生素A、维生素C时,多吃含胡萝卜素的杏、甜瓜及葡萄柚,能给身体补充大量的维生素A和维生素C;在秋季气候干燥时,宝宝易患感冒咳嗽,可以给宝宝经常做些梨粥喝,或是用梨加冰糖炖水喝,因为梨性寒,可润肺生津、清肺热,从而止咳祛痰,但宝宝腹泻时不宜吃梨。另外,皮肤生痈疮时也不宜吃桃,这样会使宝宝病情更为加重。
对于工作环境里面,可能会导致胎儿伤害的因素,如:挥发性化学物质、辐射线等,应事先安排保持安全距离。怀孕初期与后期孕妇较易疲累,必须增加休息和睡眠的时间,调整日常工作中体力的负荷程度。从事运动亦不宜太过激烈,长途旅行则应尽量安排在怀孕中期的三个月内。
怀孕前三个月,胎儿不太稳定,尽量避免或减少性生活。
本周开始由于胎儿骨胳迅速的生长,因此对钙的需要加大,这时候孕妇要注意多服用一些含钙的食品来满足自身和宝宝的生长发育的需要。现在要注意均衡饮食,保证充足的蛋白质、多种维生素、钙、铁等营养素的供给。尤其要注意加强钙和维生素D的补充,每天钙的需求量应在800毫克左右。要多喝牛奶,因为它富含钙质,它可以使尿液中的钠排泄增多,降低血容量以消除水肿。还可以防治妊娠高血压,并有益于胎儿骨骼的发育。
1、必须坚持科学的、长期的食用加碘盐。一旦停用碘盐,就容易造成碘缺乏复发。
2、一次购买碘盐不要太多,因为时间久,碘元素容易挥发。
3、在炒菜、煮汤时不宜过早放盐,宜在食物起锅时放入。
4、存放碘盐的容易应该是加盖的,并且放置在干燥、逆光避高温处。
5、碘盐要看清防伪标志,最好到正规的大型超市购买。
6、服用某些药物时要忌吃碘盐。比如服用含汞类的药物如朱砂,不宜同时食用碘盐。
森派蛋糕培训学校不错,就在罗湖东晓路那边,以传授西点、面包制作技术及蛋糕裱花技术为主的培训学校,在行业中享有盛誉。
一个好的方案肯定是要根据具体团队情况进行定制的,这样才能将培训效果做到最好。
简·爱格妮斯起先专注效劳25至50岁的老到独立的现代女人,但随着公司快.速展开和品牌效应日益闪现,男性消费市场呼声越来越激烈,所以后来又新增男装和潮流服饰。
体验式拓展训练无论是从形式上还是内容上都满足个人和企业在素质提升方面的需求,让学员在深刻的体验中,从新认识自我,激发自身的潜能,在能力和素质方面得到进一步的提升。
我们在户外进行徒步时也会遇到凹凸不平的山路,当我们在凹凸不平的山路上前进的时候,登山杖可以保持你的身体平衡,避免一些摔倒或磕磕绊绊的发生。
正在加载...
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415解决JS浮点数(小数)运算出现Bug的方法_百度经验
&&&&&&&&&大学及以上解决JS浮点数(小数)运算出现Bug的方法听语音
百度经验:jingyan.baidu.com37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.98怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。我Google了一下,发现原来这是JavaScript浮点运算的一个bug。百度经验:jingyan.baidu.com137.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.98怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。我Google了一下,发现原来这是JavaScript浮点运算的一个bug。比如:7*0.8 JavaScript算出来就是:5.0005网上找到了一些解决办法,就是重新写了一些浮点运算的函数或直接扩大倍数运算。下面就把这些方法摘录下来,以供遇到同样问题的朋友参考://除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。//调用:accDiv(arg1,arg2)//返回值:arg1除以arg2的精确结果function accDiv(arg1,arg2){var t1=0,t2=0,r1,r2;try{t1=arg1.toString().split(&.&)[1].length}catch(e){}try{t2=arg2.toString().split(&.&)[1].length}catch(e){}with(Math){r1=Number(arg1.toString().replace(&.&,&&))r2=Number(arg2.toString().replace(&.&,&&))return (r1/r2)*pow(10,t2-t1);}}//给Number类型增加一个div方法,调用起来更加方便。Number.prototype.div = function (arg){return accDiv(this, arg);}//乘法函数,用来得到精确的乘法结果//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。//调用:accMul(arg1,arg2)//返回值:arg1乘以arg2的精确结果function accMul(arg1,arg2){var m=0,s1=arg1.toString(),s2=arg2.toString();try{m+=s1.split(&.&)[1].length}catch(e){}try{m+=s2.split(&.&)[1].length}catch(e){}return Number(s1.replace(&.&,&&))*Number(s2.replace(&.&,&&))/Math.pow(10,m)}//给Number类型增加一个mul方法,调用起来更加方便。Number.prototype.mul = function (arg){return accMul(arg, this);}//加法函数,用来得到精确的加法结果//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。//调用:accAdd(arg1,arg2)//返回值:arg1加上arg2的精确结果function accAdd(arg1,arg2){var r1,r2,m;try{r1=arg1.toString().split(&.&)[1].length}catch(e){r1=0}try{r2=arg2.toString().split(&.&)[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2))return (arg1*m+arg2*m)/m}//给Number类型增加一个add方法,调用起来更加方便。Number.prototype.add = function (arg){return accAdd(arg,this);}//减法函数,用来得到精确的减法结果//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。//调用:accSubtr(arg1,arg2)//返回值:arg1减去arg2的精确结果function accSubtr(arg1,arg2){var r1,r2,m,n;try{r1=arg1.toString().split(&.&)[1].length}catch(e){r1=0}try{r2=arg2.toString().split(&.&)[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2));//动态控制精度长度n=(r1&=r2)?r1:r2;return ((arg1*m-arg2*m)/m).toFixed(n);}//给Number类型增加一个subtr 方法,调用起来更加方便。Number.prototype.subtr = function (arg){return accSubtr(arg,this);}在你要用的地方包含这些函数,然后调用它来计算就可以了。/如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了END经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。投票(0)已投票(0)有得(0)我有疑问(0)◆◆说说为什么给这篇经验投票吧!我为什么投票...你还可以输入500字◆◆只有签约作者及以上等级才可发有得&你还可以输入1000字◆◆如对这篇经验有疑问,可反馈给作者,经验作者会尽力为您解决!你还可以输入500字相关经验210100热门杂志第1期作文书写技巧944次分享第12期祝你好“孕”489次分享第1期当我们有了孩子338次分享第1期新学期 新气象169次分享第1期孕妇饮食指导564次分享◆请扫描分享到朋友圈浮点数的加减运算一般由以下五个步骤完成_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
浮点数的加减运算一般由以下五个步骤完成
&&浮点数的加减运算
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢关于浮点数加法运算的一道题目_百度知道
关于浮点数加法运算的一道题目
设浮点数X,Y,阶码(补码形式)和尾数(补码形式)如下.X:阶码0001,尾数0.1010;Y:阶码1111,尾数0.1001,设基数为2,求X+Y(阶码运算用补码,尾数运算用补码).要有过程 谢谢!
我有更好的答案
第一步:对阶Y:阶码0001,尾数:0.001001第二步:尾数相加和的尾数:0.001=0.110001所以和为:尾数:0.110001,阶码:0001
采纳率:19%
为您推荐:
其他类似问题
浮点数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2.4k 人阅读
标签:至少1个,最多5个
我在生活和工作中常常会遇到一些十分迷信机器的人,他们之中很多人都相信机器是最理智的,没有任何感情,是真正的铁面无私,因此机器的运算所给出的答案总是正确的,如果答案错误,那么一定是操作机器的人的问题。但机器的运算就一定是正确的吗?事实上,机器出现运算错误并不是一个罕见的情况,一个典型的例子便是小数运算。下面就让我们来聊一个相关的话题,在机器或者具体的说在C#语言中小数是如何被处理的?
0x01 先从一个“错误”的答案说起
既然要聊一聊机器是怎么把算术题做错的,那么我们自然要先来看一个机器运算错误的小例子。
#include &stdio.h&
void main(){
for(i = 0; i & 100; i++)
num += 0.1;
printf("%f\n", num);
这是一份C语言写成的小程序,逻辑十分简单易懂,所要实现的结果无非是将0.1相加100次之后再输出。我想不需要计算机来计算,我们自己心算就能立刻得出答案——10。那么计算机会交给我们一份什么样的答案呢?下面我们将这份C代码编译并且运行一下。答案一输出,就让人大吃一惊。怎么计算机还不如人的心算吗?如果按照慕容在前言中提到的那些朋友这时可能就开始纠结是否是代码写错了,亦或者是慕容的电脑出现了什么问题。但事实上代码是正确的,机器也是运行如常的。那么究竟是为什么计算机的运算输给了人的心算呢?这就引出了下一个问题,计算机是如何处理小数的呢?如果我们了解一下计算机处理小数的机制,那么这一切的迷就能够解开了。(当然如果有朋友用C#来对0.1加100次,之后的结果是10。但那是C#在幕后为我们做的一些隐藏工作,在计算机处理小数的问题上,本质是一样的)。
0x02 数字的格式
一个程序可以看做是现实世界的一个数字化的模型。现实世界中的一切都可以转化为数字在计算机的世界中重新复活。因此,一个不得不解决的问题就是数字是如何在计算机中表达的。这也是数字格式出现的意义。
众所周知,机器语言全部都是数字,但是本文自然不会关心全部的二进制格式。这里我们只关心现实中有意义的数字是如何在计算机中被表示的。简单而言,有意义的数字大体可以分为以下三种格式。
我们在开发的过程中遇到的大部分的数字其实都是整数。而整数在计算机中也是最容易表示的一种。我们遇到的整数都可以使用32位有符号整数来表示(Int32)。当然,如果需要,还有有符号 64 位整数数据类型(Int64)可供选择。至于和整数相对应的便是小数,而小数主要有两种表示方式。
所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。而定点小数的最常见的例子是SQL Server中的money类型。事实上定点小数已经很不错了,它显然能够适合很多需要处理小数的情况。但是它有一个与生俱来的缺点,那就是由于小数点的位置固定,因此它能表示范围是受限的。因此下面我们本文的主角就要出场了。
解决定点格式先天问题的方案便是浮点格式的出现。而浮点格式的组成则包括符号、尾数、基数和指数,通过这四部分来表示一个小数。由于计算机内部是二进制的,因此基数自然而然是2(就如十进制的基数是10一样)。因此计算机在数据中往往无需记录基数(因为总是2),而是只用符号、尾数、指数这三部分来表示。很多编程语言都至少提供了两种使用浮点格式表示小数的数据类型,即我们常常能见到的双精度浮点数double和单精度浮点数float。同样,在我们的C#语言中也存在着这两种使用了浮点格式表示小数的数据类型——按照C#语言标准双精度浮点数和单精度浮点数在C#中对应的是System.Double和System.Single。但是事实上在C#语言中还存在着第三种使用了浮点格式表示小数的数据类型,那就是decimal类型——System.Decimal(十进制浮点数,之后的文章会介绍)。需要注意的是,浮点格式的表示形式有很多,而在C#中遵循的是IEEE 754标准:
float单精度浮点数为32位。32位的构造为:符号部分1bit、指数部分8bit以及尾数部分23bit。
double双精度浮点数为64位。64位的构造为:符号部分1bit、指数部分11bit以及尾数部分52bit。
0x03 表示范围、精度和准确度
既然聊完了数字在计算机中的几种表示形式,那么接下来我们就不得不提一下在选择数字格式时的一些指标。最常见的无非是这几点:表示范围、精度、准确度。
数字格式的表示范围
顾名思义,数字格式的表示范围指的就是这种数字格式所能表示的最小的值到最大的值的范围。例如一个16位有符号整数的表示范围是从-3。如果要被表示的数字的值超出了这个范围,那么使用这种数字格式就不能正确的表示这个数字了。当然在这个范围内的数字也有可能无法被正确的表示,例如16位有符号整数是无法准确表示一个小数的,但是总有一个接近的值是可以用16为有符号整数格式来表示的。
数字格式的精度
实话实说,精度和准确度让很多人都有一种十分模糊的感觉,似乎是一样的却又有区别。但慕容需要提醒各位注意的是,精度和准确度是两个有巨大差距的概念。
通俗的来讲,数字格式的精度可以认为是该格式有多少信息用来表示一个数字。更高的精度通常意味着能够表示更多的数字,一个最明显的例子便是精度越高那么这种格式所能表示的数字就越接近真实的数字。例如我们知道1/3如果换算成小数0.3333....是无穷尽的,那么它在五位精度的情况下可以写成0.3333,而在七位的情况下就又变成了0.333333(当然,如果用七位表示五位,那么就是0.333300)。
数字格式的精度还会影响到计算的过程。举一个简单的例子,如果在计算中我们使用的是一位精度。那么整个计算可能就变成了下面的这种情况:
0.5 * 0.5 + 0.5 * 0.5 = 0.25 + 0.25
= 0.2 + 0.2
而如果我们使用的是两位精度,那么计算过程又会变成下面的情况。
0.5 * 0.5 + 0.5*0.5 = 0.25 + 0.25
      
     =0.5
对比两种精度情况下的计算结果,一位精度情况下的计算结果和正确的结果差了0.1。而使用了两位精度的情况则正常的计算出了结果。因此可以发现在计算的过程中保证精度是一件多么有意义的事情。
数字格式的准确度
数字格式的表示范围、精度都已经介绍完了,那么接下来我们就来介绍一下数字格式的准确度。刚刚已经说过了,准确度和精度是一对经常让人混淆的概念。
那么我们再通俗的给准确度来个注释,简单的说它表示的是该数字格式(特定环境)所表示的数字和真实数字的误差。准确度越高,则意味着数字格式所表示的数字和真实数字的值之间的误差越小。准确度越低,则意味着数字格式所表示的数字和真实数字的值之间的误差越大。
需要注意的一点是数字格式的精度和数字格式的准确度并没有直接的关系,这一点也是很多朋友在概念上常常会混淆的地方。使用低精度的数字格式表示的数字,并不一定要比使用高精度的数字格式所表示的数字的准确度低。
举一个简单的例子:
num = 0x05;
num1 = 0x0005;
num2 = 0x;
Single num3 = 5.000000f;
Double num4 = 5.000;
此时,我们分别使用5种不同的数字格式表示同一个数字5,虽然数字格式的精度(从8位到64位)不同,但是通过数字格式所表示出来的数和真实的数是一样的。也就是说对于数字5,这5种数字格式的准确度相同。
0x04 取整误差
了解了计算机中常见的几种数字格式之后,现在我们再来聊一聊计算机是如何通过数字格式来表示现实世界中的数字的。众所周知,计算机中使用的是0和1,即二进制,使用二进制表示整数是十分容易的一件事情,不过在使用二进制表示小数时,我们往往会产生一些疑问。例如二进制小数换算成十进制是多少呢?第一眼看上去多了一个小数点,似乎让人十分困惑。事实上它的处理和整数是一样的,即将各个数位的数值和位权相乘结果求和。小数点前的位权,大家都已经十分熟悉了,从右向左分别是0次幂、1次幂、2次幂以此递增,因此小数点前的二进制换算为十进制便是:
1 * 8 + 1 * 4 + 1 * 2 + 0 = 14
而在小数点之后的位权,相应的从左向右分别是-1次幂、-2次幂依次递减。因此小数点之后的二进制转换为十进制便是:
1 * 0.5 + 1 * 0.25 + 0 * 0.125 + 1 * 0.0625 = 0.8125
因此这个二进制小数转换为十进制便是14.8125。
通过观察小数点之后的二进制转换为十进制的过程,各位看官是否发现了很有趣的一个事实呢?那就是小数点之后的二进制并不能表示所有的十进制数,换言之有一些十进制数是无法转换成二进制的。这个很好理解,因为小数点之后,二进制的位权按照除以2的节奏递减,而十进制却是按照除以10的节奏递减。因此如果小数点后4位用二进制表示,即从.这个范围内连续的二进制数值事实上对应的十进制数是不连续的,所有可能的结果也不过是各个位权(0.5、0.25、0.125以及0.0625)相加的组合而已。
因此,一个在十进制中十分简单的数字如果用二进制来准确无误的表示,所使用的位数可能会十分长甚至是无限的。一个很好的例子便是使用二进制浮点数来表示十进制中的0.1:
double x = 0.1d;
事实上变量x中所保存的值并不是真正的十进制中的0.1,而是一个最接近十进制0.1的二进制浮点数。这是因为无论小数点之后有多少位二进制的数,2的负数次幂都无法相加得到0.1这个结果,因此0.1这个十进制数在二进制中会变成一个无限小数。
当然二进制有可能无法准确的表示一个十进制小数很好理解,因为这有点类似于在十进制中我们同样无法准确表示1/3这样的循环小数。
此时,我们便不得不和计算机妥协了。因为我们现在知道了在计算机中使用的数值可能并不等于真实世界中的数值,而是计算机使用某种数字格式表示的一个十分接近原始数字的一个值。而在整个程序运行的过程中,我们的计算机就要一直使用这个仅仅是近似的数值来参与计算,我们假设真实的数值是n,而计算机事实上会使用另一个数值n + e(当然e是一个可正可负且十分小的数)来参与计算机中的运算。此时,这个数值e便是取整误差。
而这还仅仅是一个数字在计算机中使用近似值来表示,如果该数值参与到计算中去,那么显然会带来更多误差。这也是本文一开始那个c程序之所以计算错误的原因,因为无法正确的表示参与计算的值,到最后都变成了近似值。当然C#语言相对而言要“高级”了很多,虽然在计算机中也是近似值,但是展示在大家眼前的至少还是更加符合人们“预期”的值。不过在C#中,小数计算真的是不会出错的吗?毕竟,这一切似乎仅仅是障眼法。
0x05 取与舍,C#的小数
比比是否相等
不知道各位看官在使用一些关系运算符时,有没有留意到直接使用等号比较两个小数是否相等时是否会出现一些意想不到的问题。我身边的朋友使用关系运算符直接比较两个小数大小的情况比较多,而直接比较两个小数是否相等的情况却不太多。同时我在此也想提醒各位最好不要轻易比较两个小数是否相等,即便在C#这种高级语言中仍然可能得到让人感觉“错误”的答案,这是因为我们事实上比较的是两个小数是否“接近”于相等,而不是两个数是否是真正的相等。下面这个例子可能会更好的说明这一点:
class Test
static void Main()
double f = Sum (0.1d, 0.2d);
double g = 0.3d;
Console.WriteLine (f);
Console.WriteLine (f==g);
static double Sum (double f1, double f2)
return f1+f2;
我们编译并且运行这段代码,可以看到输出了如下的内容:比较这两个小数的结果并不是true,这和我们的预期并不一样。
浮点数的真模样
我们知道,像上文中的那个二进制小数事实上也是按照人类习惯表达出来的,但是计算机可是不能识别这种带小数点的东西的哦。所以计算机会使用之前介绍的数字格式来表示这样一个数字,那么一个二进制浮点数在计算机中到底是如何表现的呢?其实在上文介绍数字格式的部分已经介绍过了,但是没有实际看一眼终究是不能有一个直观的认识,那在本文的最后,我们就来看一个二进制浮点数的在计算机中真实的样子。
这是一个64位的二进制数。如果把它作为一个双精度浮点数,那么它的各部分都分别表示了什么呢?
按照上文介绍浮点数的部分,我们可以将它分成如下几部分:
指数部分:(二进制,可以转换为十进制的1028)
尾数部分:0011
因此,将它转换为一个用二进制表示的小数,则是:
(-1)^0 * 1.0011
如果各位读者观察足够仔细的话,是否发现了有趣的一点呢?那就是在这个在计算机中用来表示双精度浮点数的64位数中,尾数部分的几位数字是:0011
但是经过从计算机中的形式转化成人类使用二进制表示小数的形式之后,数字却变成了1.,小数点之前为什么会多出了一个1呢?
这是因为在尾数部分,为了将表现形式多样的浮点数统一为同一种表示方式而规定要将小数点前的值固定为1。由于小数点前的数永远是1,因此为了节省一个数据位,这个1在计算机中并不需要被保存。
那么应该如何保证一个二进制小数的小数点前的值是1呢?这就需要对二进制小数进行逻辑移位了,通过左移或右移若干次后,将整数部分变为1。例如上文中的这个二进制小数:,我们就来试试如何把它变成计算机可以识别的浮点数的尾数吧。
(原始数据)——&(通过右移将整数部分变为1)——&0....(拓展位数,使之符合数字格式的规定)——&....(去掉整数部分,仅保留小数部分)
好了,到此关于C#或者计算机中的小数计算就写得差不多了。欢迎各位交流。
0 收藏&&|&&17
你可能感兴趣的文章
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 shell 浮点数运算 的文章

 

随机推荐