浮点数的规格化表示 非规格化表示
文章目录
- 1 浮点数的一般表示
- 2 IEEE 754标准的浮点数
- 2.1 浮点数的格式
- 2.2 浮点数的取值范围
- 2.3 类型转换时的精度损失和溢出
- 例: 将十进制小数转换成IEEE 754标准的浮点数
1 浮点数的一般表示
JfJ_fJf | J1J2…JmJ_1J_2\dots J_mJ1J2…Jm | SfS_fSf | S1S2…SnS_1S_2\dots S_nS1S2…Sn |
---|---|---|---|
阶符 | 阶码 | 数符 | 尾数 |
阶码的位数决定了浮点数的表示范围的大小,尾数的位数决定了浮点数的表示精度
- 阶符:阶码的符号位。1为负;0为正
- 阶码:即幂的大小。设幂e=(J1J2…Jm)2e=(J_1J_2\dots J_m)_2e=(J1J2…Jm)2
- 数符:尾数的符号位。1为负;0为正
- 尾数:尾数的大小。设尾数M=(S1S2…Sn)2M=(S_1S_2\dots S_n)_2M=(S1S2…Sn)2
一般基数r=2r=2r=2,则浮点数真值N=(−1)Jf∗re∗(−1)Sf∗MN=(-1)^{J_f}*r^e*(-1)^{S_f}*MN=(−1)Jf∗re∗(−1)Sf∗M
2 IEEE 754标准的浮点数
2.1 浮点数的格式
msm_sms | EEE | MMM |
---|---|---|
数符 | 阶码,用移码表示 | 尾数,用原码表示 |
类型 | 数符 | 阶码 | 尾数 | 总位数 | 阶码偏置值(十进制) | 指数范围(真值表示) | 指数范围(移码表示) |
---|---|---|---|---|---|---|---|
短浮点数 | 1 | 8 | 23 | 32 | 127 | [-126,+127] | [+1,+254] |
长浮点数 | 1 | 11 | 52 | 64 | 1023 | [-1022,+1023] | [+1,+2046] |
临时浮点数 | 1 | 15 | 64 | 80 | 16383 | [-16382,+16383] | [+1,+32766] |
从上表可以看出,IEEE 754标准的浮点数有短浮点数(单精度、float型)、长浮点数(双精度、double型)、临时浮点数三种,且数据由三部分组成:
- 数符:尾数的符号位。1表示负;0表示正
- 阶码:表示数的幂,基为2,用移码表示
- 尾数:表示数的小数部分,基为2,用原码表示。且隐藏了一位1,这样是为了多表示一位有效位(临时浮点数无隐含的1)
因此可知,一个IEEE 754标准的浮点数的值为N=(−1)ms∗2E∗(1.M)2N=(-1)^{m_s}*2^E*(1.M)_2N=(−1)ms∗2E∗(1.M)2
两点说明
1、关于阶码
1.1、为什么用移码表示
补码不能直观的表示数据的大小,比如一个8位的数据:用补码表示(−1)10=(11111111)2=FFH,(8)10=(00001000)2=08H(-1)_{10}=(11111111)_2=FFH,(8)_{10}=(00001000)_2=08H(−1)10=(11111111)2=FFH,(8)10=(00001000)2=08H,8是大于-1的,但是补码的话 FFH > 08H,这与实际结果正好相反;而移码通过加上一个偏置值(若数据为 n 位,则通常取偏置值为2n−12^{n-1}2n−1,将符号位取反即可),能够反映数据之间的实际大小关系,移码表示(−1)10=(01111111)2=7FH,(8)10=(10001000)2=88H(-1)_{10}=(01111111)_2=7FH,(8)_{10}=(10001000)_2=88H(−1)10=(01111111)2=7FH,(8)10=(10001000)2=88H,88H > 7FH,这与预期结果相符合
1.2、阶码的偏置值
阶码部分用移码表示,假设阶码为 n 位,则规定阶码偏置值取 2n−1−12^{n-1}-12n−1−1,因此短浮点数、长浮点数、临时浮点数阶码偏置值为28−1−1=127、211−1−1=1023、215−1−1=163832^{8-1}-1=127、2^{11-1}-1=1023、2^{15-1}-1=1638328−1−1=127、211−1−1=1023、215−1−1=16383。移码偏置值不是2n−12^{n-1}2n−1吗,这里为什么取 2n−1−12^{n-1}-12n−1−1,因为阶码全1是用来表示特殊用途的数,1.3条有详细解释,不理解的话直接将这当作一个规定记住即可
1.3、阶码的取值范围
假设阶码为 n 位,则可表示的范围为 0到2n−10到2^{n}-10到2n−1,,因此短浮点数、长浮点数的阶码取值范围为 0到255、0到2047。又因为当阶码全0、阶码全1时有特殊用途,所以阶码E的实际取值范围为 1到254、1到2046、1到32766(去掉阶码全0和全1)。当阶码E为全0或全1时,要综合考虑尾数M的值,它们用来表示一些特殊的数:
- 0:当E全0,M为0时用来表示0值,至于是+0/-0,则取决于符号位是0还是1。
- subnormal:当E全0,M非0时,用来表示subnormal(中文译为非规则浮点数)。它表示那些比规格化浮点数能表示的最小量级的数还小的数,例如短浮点格式的一个数1.11∗2−1281.11*2^{-128}1.11∗2−128,这已经超出了规格化形式能表示的范围,如果变成subnormal的话就是0.0111∗2−1260.0111*2^{-126}0.0111∗2−126,前面说到,规格化浮点数的隐含位为1,而subnormals的隐含位可以看成0,这就是非规格化的含义所在。并且subnormals的尾数部分有若干前导0组成,因为它已经超出了规格化形式的范围,一个数越小,它的前导0越多,否则指数部分就不符合要求。
- 无穷大:当E全1,M为0时表示无穷大,至于是+∞/−∞+\infty/-\infty+∞/−∞,则取决于符号位是0还是1。
- NaN(Not a Number):当E全1,M非0时,表示NaN。在IEEE浮点数格式中,NaN表示那些不是实数(real number)的值,例如00\frac{0}{0}00。具体细分,有两类NaN,
quiet NaNs(QNaNs)
和signaling NaNs(SNaNs)
,QNaNs表示一个不确定的值,例如一个数除以无穷大或者无穷大乘0的结果;SNaNs则用于无效的操作,以表示浮点硬件异常。
1.4、阶码的实际大小
阶码采用移码的形式表示,阶码的实际大小需要减去对应的偏置值,通过这种方式来表示阶码的正负值。所以短浮点数、长浮点数的阶码实际大小为 E−偏置值E-偏置值E−偏置值,即 1−127=−126到254−127=127、1−1023=−1022到2046−1023=10231-127=-126到254-127=127、1-1023=-1022到2046-1023=10231−127=−126到254−127=127、1−1023=−1022到2046−1023=1023
2、关于尾数
假设尾数位数为 m 位,因为尾数部分隐含了一位整数1,所以尾数的实际位数为 m+1 位,因此短浮点数、长浮点数尾数实际有效位数为24、53,真值为 1.M1.M1.M,故:
短浮点数的真值为
(−1)ms∗(1.M)∗2E−127(-1)^{m_s}*(1.M)*2^{E-127} (−1)ms∗(1.M)∗2E−127
长浮点数的真值为
(−1)ms∗(1.M)∗2E−1023(-1)^{m_s}*(1.M)*2^{E-1023} (−1)ms∗(1.M)∗2E−1023
2.2 浮点数的取值范围
以短浮点正数为例:
当阶码和尾数都取最小时(E为0000 0001,M为0),表示的数值最小,阶码部分为 1−127=−1261-127=-1261−127=−126,尾数部分为 隐含的1加上其余的23位0;
当阶码和尾数都取最大时(E为1111 11110,M全1),表示的数值最大,阶码部分为 254−127=127254-127=127254−127=127,尾数部分为 隐含的1加上其余的23位1;
所以取值范围为 1.0×2−1261.0\times 2^{-126}1.0×2−126到24个11.11…1⏞×2127\begin{matrix} 24个1 \\ \overbrace{ 1.11\dots 1 } \times 2^{127}\end{matrix}24个11.11…1×2127,即
格式 | 正数 | 负数 |
---|---|---|
单精度 | 2−126到(2−2−23)×21272^{-126}到(2-2^{-23})\times 2^{127}2−126到(2−2−23)×2127 | −2−126到−(2−2−23)×2127-2^{-126}到-(2-2^{-23})\times 2^{127}−2−126到−(2−2−23)×2127 |
双精度 | 2−1022到(2−2−52)×210232^{-1022}到(2-2^{-52})\times 2^{1023}2−1022到(2−2−52)×21023 | −2−1022到−(2−2−52)×21023-2^{-1022}到-(2-2^{-52})\times 2^{1023}−2−1022到−(2−2−52)×21023 |
2.3 类型转换时的精度损失和溢出
这里以C语言为例。C语言中的float、double型分别对应IEEE 754标准的单精度和双精度浮点数,一个int型数据占4个字节、float占4字节、double占8字节。
1 溢出
- 当float、double向int转换时可能会发生溢出,比如有符号int型表示的数据范围为 2−31到231−12^{-31}到2^{31}-12−31到231−1,而float、double类型的数据的表示范围超过了int类型
- 当double向float、int转换时可能会发生溢出、float向int转换时也可能会溢出
2.精度损失
- 当int向float转换时可能会产生精度损失,因为int类型共四字节32位,而float尾数的有效位数为24位(包括隐含的1),当int型数据的有效位数超过24的话就会发生精度损失。比如
unsignedintm=FFFFFFFFH即(2−2−31)×231unsigned \quad int\quad m = FFFF \quad FFFFH\\ 即(2-2^{-31})\times 2^{31} unsignedintm=FFFFFFFFH即(2−2−31)×231
因为 m 的二进制表示为32位1,超过了float的24位,超出的1会被舍掉,所以就会产生精度损失。 - 当double向float、int转换时可能会有精度损失,因为double类型尾数的有效位数位53,超过了float的24;而且浮点数向整数转换时,若是小数部分不为0,一定会有精度损失,因为整数没有小数部分
例: 将十进制小数转换成IEEE 754标准的浮点数
例:现有一个十进制小数43.875,请将其转换成IEEE 754类型的短浮点数(即float类型),并将最终结果用二进制或十六进制表示。
分析:
IEEE 754标准的短浮点数要符合如下几个标准
- 阶码用移码表示,占8位。其值为阶码真值加偏置值127
- 尾数用原码表示,占23位。另有一位隐含的整数1
- 最高位为数符,占1位。0表示正数、1表示负数
解答:
第一步 将十进制小数转换成二进制表示
一定要转换成 1.M 的形式,其中 M 为尾数,(43.875)10=(101011.111)2=(1.01011111)×25(43.875)_{10}=(101011.111)_{2}=(1.01011111)\times 2^5(43.875)10=(101011.111)2=(1.01011111)×25
第二步 求出数符、阶码、尾数的二进制表示
由题意知:数符 ms=0m_s=0ms=0
由第一步知:阶码 E=5=(101)2E=5=(101)_{2}E=5=(101)2,尾数M=(01011111)2M=(01011111)_2M=(01011111)2
因此:
- 1位数符为 0
- 8位阶码为(移码表示)5+127=132=(10000100)25+127=132=(1000\quad 0100)_25+127=132=(10000100)2
- 23位尾数为(原码表示)(01011111000000000000000)2(010\quad 1111\quad 1000\quad 0000\quad 0000\quad 0000)_2(01011111000000000000000)2
第三步 整理结果
数符 | 阶码 | 尾数 |
---|---|---|
0 | 1000 0100 | 010 1111 1000 0000 0000 0000 |
即 43.875=01000010001011111000000000000000=422F8000H43.875=0100\quad 0010\quad 0010\quad 1111\quad 1000\quad 0000\quad 0000\quad 0000=422F\quad 8000H43.875=01000010001011111000000000000000=422F8000H |
public class Main {public static void main(String[] args) {float f = 43.875f;// 输出浮点数的 二进制表示System.out.println(Integer.toBinaryString(Float.floatToIntBits(f)));// 输出浮点数的 十六进制表示♑System.out.println(Integer.toHexString(Float.floatToIntBits(f)));}
}
浮点数的规格化表示 非规格化表示相关推荐
- 浮点数的表示范围 规格化和非规格化
随便记录一下自己学习组成原理的时候 关于浮点数的表示范围问题 例: 18位的浮点数,12位尾码(包括符号位),6位阶码(包括符号位)阶码的基数为2. 上面给出来的是正数范围,负数取相反就ok了 ...
- 浮点型数据规范以及规格化与非规格化数据(更新:原文疑问已解)
最近需要在硬件中处理一些浮点型数据,所以就花了一上午时间重新温习了一下浮点型数据的一些规范和标准,又有很多新收获,将他们整理出来. 为了容易理解和对比,以下整理分别列出单精度浮点和双精度浮点的对应情况 ...
- IEEE浮点数表示--规格化/非规格化/无穷大/NaN
转自:http://blog.csdn.net/hqin6/article/details/6701109 1.规格化的值 以sizeof(float)=4为例: 1.5的浮点数表示: 1)1.5转换 ...
- 非规格化浮点数表示范围
非规格化浮点数表示范围
- C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么?
C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么? 浮点数与定点数 小数在内存中以浮点数形式存储.浮点数并不是一种数值分类,他和整数.小 ...
- 汇编之浮点数处理(CrackMe003前置知识)
文章目录 浮点数的二进制表示 IEEE二进制浮点数的表示 1.符号位 2.有效数字 3.有效数字的精度 阶码 规格化二进制浮点数 新建IEEE表示 实数编码 单精度数转换为十进制 浮点单元 FPU寄存 ...
- 你应该知道的浮点数基础知识
本文从一个有趣而又令人意外的实验展开,介绍一些关于浮点数你应该知道的基础知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://ce ...
- java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...
整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...
- 【汇编语言与计算机系统结构笔记03】浮点数的计算机表示,IEEE 754,舍入(rounding),C语言中的浮点数
本次笔记内容: 04.浮点数的计算机表示 文章目录 IEEE的浮点数标准 IEEE的754标准 浮点数示例 计算机中浮点数二进制表示 浮点数的类型 规格化浮点数(Normalized) 规格化浮点数示 ...
最新文章
- 为什么极度随机树比随机森林更随机?这个极度随机的特性有什么好处?在训练阶段、极度随机数比随机森林快还是慢?
- python (ploit3)hexun
- Bugku——Web——矛盾
- java单纯形法_单纯形法 - fjzzq2002 - 博客园
- OpenCV---直线检测
- 易用性软件测试用例,易用性测试用例集
- xpraid安装_在Win2003/XP安装光盘中集成RAID驱动 不用软驱装RAID/SATA/SAS驱动
- Mimics-基础操作教程-1
- cad剖切线的快捷键_cad快捷键(最全CAD快捷键大全 )
- 【天光学术】美术论文:湖南传统雕刻艺术的表现形式与特点(节选)
- 问卷星指定内容批量自动填写的Python+Selenium+Pandas+Excel解决方案
- 支付宝转账支付宝转卡(H5飞行模式)
- TweenMax特效
- 企业微信SCRM软件打造私域营销闭环?以保险行业为例
- 赵小楼《天道》《遥远的救世主》深度解析(134)做了你该做的,就要受你该受的
- 【转】faster-rcnn原理及相应概念解释
- Halcon——颜色识别提取
- 【贪心】605. 种花问题
- 解锁ERD Online 高级隐藏功能
- 艺赛旗RPA--经验分享:Python 之深浅拷贝