目录

一、介绍32位单精度格式

二、介绍几种数的区别

三、 规格数

作用:

格式:

意义:

四、非规格数

作用:

格式:

意义:

五、非规格数补充

逐渐溢出

密集分布

六、特殊数

无穷

NaN


一、介绍32位单精度格式

二、介绍几种数的区别

三、 规格数

作用:

格式:

作:

四、非规格数

作用:

格式:

意义:

五、非规格数补充

逐渐溢出

密集分布

六、特殊数

无穷

NaN


在IEEE754浮点数标准,提供了两种基本浮点格式,32位单精度格式和64位双精度格式,格式如下:

下面我以32位单精度格式为例子,分别解释规格数非规格数特殊数

一、介绍32位单精度格式

如上图:以32位浮点数为例, 其内存状态分为3部分:1位符号位 8位阶码 23位尾数

尾数用原码表示,阶码用移码表示,偏置常数是127

浮点是的取值范围:

对应图:

二、介绍几种数的区别

形如阶码为00000000的数,即8位阶码全为0, 就代表当前数是个非规格数

形如阶码为11111111的数,即8位阶码全为1, 就代表当前数是个特殊数

如果既不是非规格数,也不是特殊数,那它就是规格数(阶码不全为0, 也不全为1)

(下面会解释)

三、 规格数

作用:

用于表示最常见的数值:像3.1415、141615、2.11等

格式:

符号位, 1位: 可正可负

阶码位, 8位: 不全为0且不全为1

尾数位, 23位: 尾数位前隐藏的整数部分是1. 而非 0.(后面会解释)

对于32位浮点数来说, 规格数的阶码位的取值范围是[1, 254], 偏置bias是127, 所以阶是:[-126, 127]

阶码  = 偏置常数 + 阶

所以我们可以知道尾数位的取值范围(二进制表示)是

[1.00000000000000000000000, 1.11111111111111111111111] 

换算成10进制为 [1,2)

意义:

无法表示 0 和 及其靠近0 的数

why:规格数的取值范围是

这个数始终大于0, 即便2^-167非常小, 但还是大于0,那么: 一个始终大于1的数 * 一个始终大于0的数, 永远无法等于0,也就是说: 使用规格数时, 我们除了无法表示0, 也无法表示(0, 2^-167)之间的, 靠近0的极小数...

绿色区域就是32位浮点数中规格数的取值范围, 可见它取不到0和靠近0的极小数

四、非规格数

作用:

用于表示0, 以及非常靠近0的数

格式:

符号位, 1位: 可正可负

阶码位, 8位: 全为0

对于32位浮点数来说, 规格数的指数位全为0, 对应的值也是0. 偏置bias依旧是127, 但:

实际指数的计算方法是: 实际指数 = 1 - bias = 1 - 127 = -126,

非规格数的实际指数固定为-126. 注意这是规定.(后面会解释)

其实我们可以发现, 非规格数实际指数的计算方法(实际指数 = 1 - bias), 和规格数实际指数的计算方法(实际指数 = 指数位的值 - bias)不同

尾数位, 23位: 尾数位前隐藏的整数部分是0. 而非 1.

即尾数位的取值范围(二进制)是

[0.00000000000000000000000, 0.11111111111111111111111] 

换算为10进制为[0,1)

意义:

表示0和靠近0的数

非规格数尾数的取值范围是[0, 1), 指数固定为-126. 这就很简单了, 让尾数取0不就能表示数值0了:

可见当尾数取0时, 通过变更符号位, 我们可以表示出+0-0, IEEE754规范中也确实存在着这两种表示0的方式

对于32位浮点数, 非规格数是怎么表示出

也就是如何表示出下图中的红色区域的

将规格数和非规格数的取值范围结合在一块,即

这就是非规格数的作用: 用于表示0和靠近0的数, 用于和规格数"珠联璧合", 形成一个完整的取值范围

五、非规格数补充

逐渐溢出

前文说过, 非规格数尾数的取值范围是[0, 1), 指数固定为-126

所以是尾数的变化在导致非规格数的值变大, 举例:

0 00000000 00000000000000000000001

就比

0 00000000 00000000000000000000000

要大一些

随着尾数逐渐增大, 相应的非规格数也在不断增大:

0 00000000 11111111111111111111111 这是非规格数的最大值

此时尾数(带上隐藏的整数部分0.)其实是0.11111111111111111111111, 是个比1小一点点的数, 不妨记做(1 - ε)

那, 此时非规格数的值就是

再往前前进一格, 此时会进入规格数的范围:

0 00000001 00000000000000000000000

这是个规格数,

其尾数位的值: 其实隐藏了 1. 或者说, 此时真正的尾数应该是1.00000000000000000000000 , 也就是1

其指数位的值: 是1, 则实际指数应该是1 - bias = 1-127 = -126

所以这个规格数的值就是:

这是规格数的最小值.

注意到没有: 非规格数的最大值是:

规格数的最小值是:

两者之间实现了非常平滑的过度, 非规格数的最大值非常紧密的连接上了规格数的最小值

非规格数 "一点点逐渐变大, 最后其最大值平稳的衔接上规格数的最小值", 这种特性在ieee754中被叫做逐渐溢出(gradual underflow)

明白了这一点, 就很容易想通:

① 为什么规定非规格数的尾数前隐藏的整数部分是 0. 而规格数尾数前隐藏的整数部分是1.

(这使得非规格数的尾数取值范围是[0,1), 而规格数的尾数取值范围是[1,2), 两者平滑的衔接在了一起)

② 为什么非规格数的真实指数的计算公式是 1 - bias, 而规格数的真实指数的计算公式是 指数部分的值 - bias 了

(这使得对于32位浮点数来说, 非规格数的真实指数固定为-126, 而规格数的指数是[-126, 127], 两者也平滑的衔接在了一起...)

密集分布

非规格数: 范围是

在这个范围中分布了2^23个蓝点, 则蓝点间的间隔是

规格数中蓝点最密集的区域, 也就是最靠近0的区域是:

, 在这个范围中分布了2^23个蓝点, 则蓝点间的间隔是

所以, 即便把非规格数与规格数放在一起审视, ieee754浮点数表盘上的蓝点依旧是越靠近0越密集, 越靠近∞越稀疏

六、特殊数

特殊数分为两种: 无穷和NaN

无穷

符号位, 1位: 可正可负

阶码位, 8位: 全为1

尾数位, 23位: 全部为0

当内存位于上述状态时, 就表示无穷(infinity)

具体写出来就是: * 11111111 00000000000000000000000 用于表示无穷(infinity)

其中符号位可正可负, 分别记做+infinity和-infinity

以32位浮点数为例, 其规格数的取值范围是:

当要存储的数大于规格数取值范围的最大值时, 就会被记做+infinity, 比如2^128, 刚刚超过规格数的取值范围的最大值, 就会被记做+infinity

当要存储的数小于规格数取值范围的最小值时, 就会被记做-infinity, 比如-2^128, 刚刚小于规格数的取值范围的最小值, 就会被记做-infinity

需要注意的是: 所有+infinity的内存状态都是0 11111111 00000000000000000000000, 不会有任何变动

2^128对应的内存状态是0 11111111 00000000000000000000000

2^123456789对应的内存状态还是0 11111111 00000000000000000000000

同理, -infinity的内存状态都是1 11111111 00000000000000000000000

此外: 就像非规格数的最大值可以和规格数的最小值平稳衔接一样, 规格数的最大值也可以和+infinity平稳衔接:

规格数的最大值是: 0 11111110 11111111111111111111111

尾数位其实是1.11111111111111111111111, 非常接近2, 不妨记做2-ε

阶是127

所以最大值是:

+infinity的内存状态则是: 0 11111111 00000000000000000000000

尾数其实是: 1.00000000000000000000000, 等于1

指数是128

所以+infinity的内存状态对应的值是:

可见规格数的最大值也能和+infinity平稳衔接. -infinity同理.

现在我们就集齐了整个数轴:

NaN

NaN则更简单, 前面说过, 如果计算出来的值不是一个数值, 则记录为NaN

NaN的内存状态是:

符号位, 1位: 可正可负

阶码位, 8位: 全为1

尾数位, 23位: 不全为0即可

参考:

IEEE754规范: 四, 非规格数, ±infinity, NaN - 知乎 (zhihu.com)

IEEE754浮点数标准相关推荐

  1. 【体系结构】IEEE754浮点数标准学习与机器码表示总结

    怎么上传了,排版和Typora差这么多-头疼,就这样吧- 一 IEEE754浮点数标准学习 没想到本科不喜欢.瞎学的祭祖,现在还是得重新.认真地重学一遍."不喜欢"果然无法成为拒绝 ...

  2. IEEE754浮点数数

    1.IEEE754浮点数标准 1.1标准形式 S(数符) 阶码(含阶符) 尾数 1.2不同的浮点数标准 符号位S 阶码 尾数 总位数 短实数 1 8 23 32 长实数 1 11 52 64 临时实数 ...

  3. IEEE754浮点数

    IEEE754浮点数 一个浮点数包括三部分: 符号部分(Sign).指数部分(Exponent).分数部分(Fraction) IEEE754浮点数不是均匀分布的.仅能代表有限个数的实数 对于norm ...

  4. IEEE754 浮点数的表示方法

    原文地址:https://blog.csdn.net/K346K346/article/details/50487127 1.浮点数的存储格式 浮点数(Floating-point Number)是对 ...

  5. IEEE754浮点数格式详解

    IEEE754浮点数格式详解 几乎所有计算机都支持二进制数据表示,即能直接识别二进制数据表示并具有相应的指令系统.通常采用的二进制定点数据表示主要有:符号数值.反码.补码以及带偏移增值码四种形式,其中 ...

  6. IEEE754 浮点数:简读+案例=秒懂

    IEEE754 浮点数:简读+案例=秒懂 在IEEE 754 格式浮点数由 3 个部分组成,分别是 符号码,阶码,尾数码,对应部分所占位数如图 1-1 所示: 图 1-1 IEEE 754 标准分 3 ...

  7. 一文读懂 IEEE754 浮点数的表示方法

    FBI WARNING:鄙人首个开源电子书 <Go 编码建议>已经上线啦,欢迎各位大佬斧正指导,协同共建. 文章目录 1.浮点数的存储格式 2.移码 3.浮点数的规格化 3.1 单精度浮点 ...

  8. IEEE754浮点数规格化表示

    在学习<软件设计师教程>中的浮点数IEEE754工业标准期间遇到一些问题,理解后写篇文章,加深自己理解,也方便日后复习 IEEE754规定: 单精度浮点数字长32位,尾数长度23,指数长度 ...

  9. IEEE754浮点数简介

    IEEE754协议使用一个固定长度的数据结构来表示实数的近似值.数据结构有三部分:1位符号s.k位阶码编码 e=ek−1ek−2...e0和n位尾数编码 f=fn−1fn−2...f0. s.e和f三 ...

最新文章

  1. 独家 | Tableau小技巧之分离Box plot和Unit Histogram(附链接)
  2. 8080端口被占用的解决方案(其它端口同理)
  3. linux Firefox汉化
  4. 开发者们,「Innovation 2021」网易应用创新开发者大赛正式开赛了!
  5. 天平应什么放置_天平是否应该放干燥剂?
  6. LeetCode之Keyboard Row
  7. Flutter Plugin开发流程
  8. 【前排选手分享】初赛尾声将至,大神带你最后一搏!
  9. NoSQL精粹pdf
  10. usbcan、can分析仪的产品特点和功能特点
  11. 关于神经网络的英语单词有,神经网络的英文单词
  12. c语言12 345 6789,c语言知识点
  13. 每个知识库管理系统必备的七大关键功能
  14. [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此
  15. waves系统服务器,waves服务器:插件挂多了电脑宕机了?Impact Server服务器拯救你的电脑CPU!...
  16. android ibeacon模拟器,未使用信标模拟器检测到iBeacon
  17. 泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  18. Chrome浏览器首次打开后未响应较长时间
  19. nova与neutron交互
  20. ffmpeg 将.m4a音频转换为.wav文件

热门文章

  1. php-java-net-python-爱心公益网站()计算机毕业设计程序
  2. 华为用linux系统装eclipse,centos装eclipse
  3. 如何在Digital Ocean VPS上安装cpanel / whm
  4. 阿里云数据库与传统数据库有何区别?
  5. 和能力匹配的目标才是战略
  6. 用cmd进入DOS窗口的步骤
  7. iframe中加入html,HTML中IFRAME标签的使用
  8. 鸿蒙系统翻车了,华为鸿蒙系统“翻车了”?被质疑抄袭安卓11系统,事实并非如此...
  9. H3C防火墙开启web流量监控命令
  10. html图片右边加竖线,关于图片右边的竖线问题