IEEE 浮点数 规格化

IEEE念作"eye-triple-ee"

定义

IEEE浮点标准用 V = ( − 1 ) s × M × 2 E V=(-1)^s{\times}M{\times}2^E V=(1)s×M×2E 的形式来表示一个数

  • 符号(sign): s s s 正负,对于数值0的符号位解释作特殊情况处理
  • 尾数(significand) M M M是一个二进制小数,它的范围是 1 ∼ 2 − ε 1\sim2-\varepsilon 12ε,或者 0 ∼ 1 − ε 0\sim1-\varepsilon 01ε
  • 阶码(exponent) E E E的作用是对浮点数加权,这个权重是2的 E E E次幂(可能是负数)。

将浮点数的位表示划分为三个字段,分别对这些值进行编码:

  • 一个单独的符号位 s s s 直接编码符号 s s s
  • k k k位的阶码字段 exp= e k − 1 . . . e 1 e 0 \text{exp=}e_{k-1}...e_1e_0 exp=ek1...e1e0 编码阶码 E E E
  • n n n位小数字段 frac= f n − 1 . . . f 1 f 0 \text{frac=}f_{n-1}...f_1f_0 frac=fn1...f1f0 编码尾数 M M M,但是编码出来的值也依赖于阶码字段的值是否等于0

在这里插入图片描述

情况1:规格化的值

 这是最普遍的情况。当exp的位模式既不全为0(数值0),也不全为1(单精度数值为255,双精度数值为2047)时,都属于这类情况。在这种情况中,阶码字段被解释为以偏置(biased)形式表示的有符号整数。也就是说,阶码的值是 E = e − B i a s E=e-Bias E=eBias,其中 e e e 是无符号数,其位表示为 e k − 1 … e 1 e 0 e_{k-1}…e_1e_0 ek1e1e0,而 B i a s Bias Bias 是一个等于 2 k − 1 − 1 2^{k-1}-1 2k11 (单精度是127,双精度是1023)的偏置值。由此产生指数的取值范围,对于单精度是 − 126 ~ + 127 -126~+127 126127,而对于双精度是 − 1022 ~ + 1023 -1022~+1023 10221023
 小数字段frac被解释为描述小数值 f f f,其中 0 ≤ f < 1 0≤f<1 0f<1,其二进制表示为 0. f n − 1 … f 1 f 0 0.f_{n-1}…f_1f_0 0.fn1f1f0 ,也就是二进制小数点在最高有效位的左边。尾数定义为 M = 1 十 f M=1十f M=1f 。有时,这种方式也叫做隐含的以1开头的(implied leading 1)表示,因为我们可以把 M M M看成一个二进制表达式为 1. f n − 1 f n − 2 … f 0 1.f_{n-1}f_{n-2}…f_0 1.fn1fn2f0 的数字。既然我们总是能够调整阶码 E E E,使得尾数 M M M 在范围 1 ≤ M < 2 1≤M<2 1M<2 之中(假设没有溢出),那么这种表示方法是一种轻松获得一个额外精度位的技巧。既然第一位总是等于1,那么我们就不需要显式地表示它。

情况2:非规格化的值

 当阶码域为全0时,所表示的数是非规格化形式。在这种情况下,阶码值是 E = 1 − B i a s E=1-Bias E=1Bias,而尾数的值是 M = f M=f M=f,也就是小数字段的值,不包含隐含的开头的1。
 非规格化数有两个用途。首先,它们提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使 M ≥ 1 M≥1 M1,因此我们就不能表示0。实际上,+0.0的浮点表示的位模式为全0:符号位是0,阶码字段全为0(表明是一个非规格化值)而小数域也全为0,这就得到 M = f = 0 M=f=0 M=f=0。令人奇怪的是,当符号位为1,而其他域全为0时,我们得到值-0.0。根据IEEE的浮点格式,值+0.0和-0.0在某些方面被认为是不同的,而在其他方面是相同的。
 非规格化数的另外一个功能是表示那些非常接近于0.0的数。它们提供了一种属性,称为逐渐下溢(gradual underflow),其中,可能的数值分布均匀地接近于0.0。

情况3:特殊值

 最后一类数值是当指阶码全为1的时候出现的。当小数域全为0时,得到的值表示无穷,当s=0时是 + ∞ +\infty +,或者当s=1时是 − ∞ -\infty 。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为“NaN”,即“不是一个数(Not a Number)”的缩写。一些运算的结果不能是实数或无穷,就会返回这样的NaN值,比如当计算 − 1 \sqrt{-1} 1 ∞ − ∞ \infty-\infty 时。在某些应用中,表示未初始化的数据时,它们也很有用处。




 可以观察到最大非规格化数 7 512 \frac{7}{512} 5127和最小规格化数 8 512 \frac{8}{512} 5128之间的平滑转变。这种平滑性归功于我们对非规格化数的 E E E 的定义。通过将 E E E 定义为 1 − B i a s 1-Bias 1Bias,而不是 B i a s Bias Bias,我们可以补偿非规格化数的尾数没有隐含的开头的1。

 同时在机器中存储的浮点数据会出现精度缺失和大数吃小数

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IEEE 754标准定义了浮点数的二进制表示方法,其中单精度浮点数占用32位,双精度浮点数占用64位。下面是IEEE 754浮点数转换为十进制数的步骤: 1. 确定符号位:第1位为符号位,0表示正数,1表示负数。 2. 确定指数位:对于单精度浮点数,指数位占8位,双精度浮点数指数位占11位。指数位的值需要减去一个偏移量,对于单精度浮点数,偏移量为127,对于双精度浮点数,偏移量为1023。例如,对于单精度浮点数01111111,其指数位的值为127-127=0。 3. 确定尾数位:对于单精度浮点数,尾数位占23位,双精度浮点数尾数位占52位。尾数位的值需要加上一个隐含的1,例如,对于单精度浮点数1.10110100000000000000000,其尾数位的值为1.10110100000000000000000+1=1.101101000000000000000001。 4. 计算十进制数:根据符号位、指数位和尾数位的值,可以计算出对应的十进制数。对于单精度浮点数,其值为(-1)^{符号位} * 2^{指数位} * 尾数位的值,例如,对于单精度浮点数01111111110110110000000000000000,其值为(-1)^0 * 2^{254-127} * 1.10110100000000000000000=3.1415927410125732。 下面是将十进制数转换为IEEE 754浮点数的步骤: 1. 确定符号位:如果十进制数为正数,则符号位为0,否则为1。 2. 将十进制数转换为二进制数,并将小数点移动到最左边或最右边,得到规格化数。例如,对于十进制数-3.1415926,其规格化数为-11.00100100001111110110101。 3. 计算指数位:对于规格化数,指数位为小数点移动的位数加上偏移量。对于单精度浮点数,偏移量为127,对于双精度浮点数,偏移量为1023。例如,对于规格化数-11.00100100001111110110101,小数点向左移动3位,加上偏移量127,得到指数位为130。 4. 计算尾数位:对于规格化数,尾数位为小数点移动后的数的二进制表示,去掉小数点前面的1。例如,对于规格化数-11.00100100001111110110101,其尾数位为.00100100001111110110101。 5. 将符号位、指数位和尾数位组合起来,得到IEEE 754浮点数的二进制表示。 下面是一个单精度浮点数转换为十进制数的例子: 引用: 01000000101100000000000000000000 符号位为0,指数位为10000001,尾数位为01100000000000000000000。 指数位的值为129-127=2,尾数位的值为1.375。 因此,该浮点数的值为(-1)^0 * 2^2 * 1.375=5.5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值