开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2512|回复: 1
收起左侧

[源码分享] 浮点栈溢出条件

 关闭 [复制链接]
结帖率:0% (0/1)
发表于 2011-7-9 16:06:15 | 显示全部楼层 |阅读模式   湖北省宜昌市
本帖最后由 huhua 于 2011-7-9 16:07 编辑

不知道大家写软件有时候处理数据会不会出现什么直接自动退出的问题,一般有可能就是浮点栈溢出或者出现了越权指令!下面是我找的一篇相关的浮点溢出的文章!希望对大家有帮助!
浮点数经常被写成如下的形式:
      X = Mx * 2Ex

  其中Mx为该浮点数的尾数,一般为绝对值小于1的规格化的二进制小数,机器中多用原码(或补码)形式表示。Ex为该浮点数的阶码,一般为二进制整数,机器中多用移码(或补码)表示,给出的是一个指数的幂,而该指数的底常用2、8或16,我们这里先以2为底作例子进行讨论。
  浮点加减法的运算步骤
  假定有两个浮点数
     X = Mx * 2Ex , Y = My * 2Ey
  1. 实现X±Y运算,要用如下五步完成:
  (1) 对阶操作,即比较两个浮点数的阶码值的大小.求△E=Ex-Ey。当其不等于零时,首先应使两个数取相同的阶码值。其实现方法是,将原来阶码小的数的尾数右移|△E|位,其阶码值加上|△E|,即每右移一次尾数要使阶码加1,则该浮点数的值不变(但精度变差了)。尾数右移时,对原码形式的尾数,符号位不参加移位,尾数高位补0;对补码形式的尾数,符号位要参加右移并使自己保持不变。为减少误差,可用
  另外的线路,保留右移过程中丢掉的一到几位的高位值,供以后舍入操作使用。

  (2) 实现尾数的加(减)运算,对两个完成对阶后的浮点数执行求和(差)操作。

  (3) 规格化处理,若得到的结果不满足规格化规则,就必须把它变成规格化的数,对双符号位的补码尾数来说,就必须是001××…×或
 
  110××…×的形式。这里的规格化处理规则是:
  .当结果尾数的两个符号位的值不同时,表明尾数运算结果溢出。此时应使结果尾数右移一位,并使阶码的值加1,这被称为向右规格化,简称右规。

  .当尾数的运算结果不溢出,但最高数值位与符号位同值,表明不满足规格化规则,此时应重复地使尾数左移、阶减减1,直到出现在最高数值位上的值与符号位的值不同为止,这是向左规格化的操作,简称左规。

  (4) 舍入操作。在执行对阶或右规操作时,会使尾数低位上的一位或多位的数值被移掉,使数值的精度受到影响,可以把移掉的几个高位的值保存起来供舍入使用。舍入的总的原则是要有舍有入,而且尽量使舍和入的机会均等,以防止误差积累。常用的办法有"0"舍"1"入法,即移掉的最高位为1时 则在尾数末位加1;为0时则舍去移掉的数值。该方案的最大误差为2-(n+1)。这样做可能又使尾数溢出,此时就要再做一次右规。另一种方法 "置1"法,即右移时,丢掉移出的原低位上的值,并把结果的最低位置成1。该方案同样有使结果尾数变大或变小两种可能。即舍入前尾数最低位已为0,使其变1,对正数而言,其值变大,等于最低位入了个1。若尾数最低位已为1,则再对其置1无实际效用,等于舍掉了丢失的尾数低位值。

  (5) 判结果的正确性,即检查阶码是否溢出。浮点数的溢出是以其阶码溢出表现出来的。在加减运算真正结束前,要检查是否产生了溢出,若阶码正常,加(减)运算正常结束;若阶码下溢,要置运算结果为浮点形式的机器零,若上溢,则置溢出标志。


图2.21 规格化浮点加减运算流程
  看一个浮点数加法运算的实例。
  假定 X=2010 * 0.11011011, Y=2100 * (-0.10101100)则它们的浮点表示分别为
         阶符  阶码  数符  尾数
     [X]浮 = 00   010   00  11011011
     [Y]浮 = 00   100   11  01010100
           补码      补码

  执行X+Y的过程如下:
  (1)求阶差和对阶
   △ E = Ex-Ey = [Ex]浮 +[-Ey]浮 = 00 010 + 11 100 = 11 110即△E 为-2,
X的阶码小,应使Mx右移两位,Ex加2, 得[X]浮 = 00 100 00 00110110 11

  (2)尾数求和
     00 00110110
    + 11 01010100
    
     11 10001010
  (3)规格化处理
  结果的符号位与最高数值位同值,应执行左规处理,结果为11 00010101 10, 阶码为00 011。

  (4)舍入处理
  采用0舍1入法处理,则有
     11 00010101
    +      1
    
     11 00010110

  (5)判溢出
  阶码符号位为00.不溢出,故得最终结果为 X+Y = 2011 *(-0.11101010)


发表于 2012-9-13 10:26:00 | 显示全部楼层   河北省唐山市
这么高深呀 搞不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表