浮点类型数据的取值范围什么意思

一、浮点类型数据的取值范围什么意思?

浮点类型数据的取值范围:  实数的计算机内部表示由具体系统规定,其中不少系统采用通行的国际标准(IEEE 标准,IEEE 是电子电器工程师协会,是一个著名的国际性技术组织):  (1) 浮点类型的数用4个字节32位二进制表示。这样表示的数大约有7位十进制有效数字,数值的表示范围约为±(3.4×10^38…3.4×10^38);  (2) 双精度类型的数用8个字节64位二进制表示,双精度数大约有16位十进制有效数字,数值的表示范围约为±(1.7×10^308…1.7×10^308);  (3) 长双精度类型的数用10个字节80位二进制表示,大约有19位十进制有效数字,其数值的表示范围约为±(1.2×10^4932—1.2×10^4932) 。

浮点类型数据的取值范围什么意思

二、32位浮点数的取值范围?

浮点数可以表示-∞到+∞,这只是一种特殊情况,显然不是我们想要的数值范围。

以32位单精度浮点数为例,阶码E由8位表示,取值范围为0-255,去除0和255这两种特殊情况,那么指数e的取值范围就是1-127=-126到254-127=127。

(1)最大正数

因此单精度浮点数最大正数值的符号位S=0,阶码E=254,指数e=254-127=127,尾数M=111 1111 1111 1111 1111 1111,其机器码为:0 11111110 111 1111 1111 1111 1111 1111。

那么最大正数值:

PosMax=(?1)S×1.M×2e=+(1.11111111111111111111111)×2127≈3.402823e+38。

这是一个很大的数。

(2)最小正数

最小正数符号位S=0,阶码E=1,指数e=1-127=-126,尾数M=0,其机器码为0 00000001 000 0000 0000 0000 0000 0000。

那么最小正数为: PosMin=(1)S×1.M×2e=+(1.0)×2126≈1.175494e38。

这是一个相当小的数。几乎可以近似等于0。当阶码E=0,指数为-127时,IEEE754就是这么规定1.0×2?127近似为0的,事实上,它并不等于0。

(3)最大负数

最大负数符号位S=1,阶码E=1,指数e=1-127==-126,尾数M=0,机器码与最小正数的符号位相反,其他均相同,为:1 00000001 000 0000 0000 0000 0000 0000。

最大负数等于: NegMax=(?1)S×1.M×2e=?(1.0)×2?126≈?1.175494e?38。

(4)最小负数

符号位S=0,阶码E=254,指数e=254-127=127,尾数M=111 1111 1111 1111 1111 1111,其机器码为:1 11111110 111 1111 1111 1111 1111 1111。

扩展资料

一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。

m(即尾数)是形如±d.ddd…ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

完成浮点加减运算的操作过程大体分为四步:

1、0 操作数的检查;

2、比较阶码大小并完成对阶;

3、尾数进行加或减运算;

4、结果规格化并进行舍入处理。

三、32位浮点数范围的求法

浮点数可以表示-∞到+∞,这只是一种特殊情况,显然不是我们想要的数值范围。

以32位单精度浮点数为例,阶码E由8位表示,取值范围为0-255,去除0和255这两种特殊情况,那么指数1-127=-126到

(1)最大正数

因此单精度浮点数最大正数值的符指数e=254-127=127,尾数M=111 1111 1111 1111 1111 111111110 111 1111 1111 1111 1111 1111。

那么最大正数值:

PosMax=(?1)S×1.M×2e=+(1.11111111111111111111111)×2127≈3.402823e+38。

这是一个很大的数。

(2)最小正数

最小正数符号位S=0,阶码E=1,指数e=1-127=-126,尾数M=0,其机器码为0 00000001 000 0000 0000 0000 0000 0000。

那么最小正数为×1.M×2e=+(1.0)×2126≈1.175494e38。

这是一个相当小的数。几乎可以近似等于0。当阶码E=0,指数为-127时,IEEE754就是这么规定1.0×2?127近绝裂链似为源胡0的,事实上,它并不等于0。

(3)最大负数

最大负数符号位S=1,阶码E=1,指数e=1-127==-126,尾数M=0,机器码与最小正数的符号位相反,其他均相同01 000 00000。

最大负数等于: Ne×2e=?(1.0)×2?14e?38。

(4)最小负数

符号位S=0,阶码E=254,指数e=254-127=127,1 1111 1111 1111,其机器码为:1 11111110 111 1111 1111 1111 1111 1111。

扩展资料

一个浮点数a由两个数m任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。

m(即尾数*****…ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

完成浮点加减运算的操并孙作过程大体分为四步:

1、0 操作数的检查;

2、比较阶码大小并完成对阶;

3、尾数进行加或减运算;

4、结果规格化并进行舍入处理。

四、IEEE754标准: 二, 32位浮点数的取值范围

这是”IEEE754标准系列”的第二篇文章. 主要讨论32位浮点数 (或者说float类型) 的取值范围到底是如何计算出来的.

本章主要参考自 IEEE754 wiki

这里先直接给出维基上的取值范围:

可见float类型, 或者说32位浮点数的取值范围是 :

或者说是:

直观表示的话就是:

[-340000000000000000000000000000000000000, -0.0000000000000000000000000000000000000118] ∪ [0.0000000000000000000000000000000000000118, 340000000000000000000000000000000000000]

在详细介绍这个范围是怎么计算出来的之前, 我们必须先了解一些概念.只有了解了这些概念, 才能真正的理解浮点数的取值范围是如何计算出来的.

而且此处假定你已经对IEEE754浮点数在内存中的存储方式有所了解, 还不了解的话也可以参考本系列的第一篇文章.

那这就开始吧

根据IEEE754的规定, 按照尾数位隐藏的整数部分是 1. 还是 0. 可以将浮点数划分为两类: normal number(规格数)? 和 subnormal number(非规格数)

下面以32位浮点数为例来解释这些概念.

normal number(规格数)

就是尾数位隐藏的整数部分是 1. 的数, 这种数叫做normal number, 可以理解为”正常的数”

一般来说, 我们遇到的都是normal number

举例: 20.5在内存中表示为: 0? 1000 0011? 0100 1000 0000 0000 000

其中尾数部分(即上面的加粗部分), 去掉后面补的零之后为: 01001

但事实上, 真实的尾数部分应该是: 1. 01001, 即前面省略了整数部分 1.

subnormal number(非规格数)

尾数位隐藏的整数部分为 0. 的数, 叫做subnormal number, 也叫作denormal number, 可以理解为”低于正常数的数”

引入subnormal number这个概念, 是为了在浮点数下溢时, 可以逐位的损失精度, 以尽可能精确的表达0附近的极小数, 之后的章节会具体讲解.

为了表示subnormal number, IEEE754规定: 如果将指数位全部填充为0, 则表示这个数是个subnormal number

举例: 以32位浮点数为例, 当你看到类似于 * 00000000 *********************** 这样内存状态的数时, (即指数位全部为0的数), 就应该知道, 这是个subnormal number, 此时这个数的尾数位隐藏的整数不是 1. ? 而是 0.

和subnormal number类似, IEEE754对于指数位全为1的状态也做了特殊规定:

当指数位全部被1填充, 即指数位表示的值为255时, 用于表示这个浮点数处在一种非正常数(non-number)的状态: 即这个数可能是±infinity或NaN.

注: Infinity和NaN是两个特殊数, 分别表示 无穷 和 Not a Number. 我们后文还会详细讨论这两个特殊数

所以: 当你看到类似于 * 11111111 *********************** 这样内存状态的数时, (即指数位全部为1的数), 就应该知道, 这是个non-number, 它用于表示特殊数.

在了解了上面两个概念之后, 再看计算方法就很简单了.

如上所述, IEEE754规定, 当指数位全部为0或者全部为1时, 用于表示两种特殊状态的数: subnormal number 和 non-number, 所以现在可以得到如下示意图, 以32位单精度浮点数为例:

这就是理解单精度浮点数取值范围的关键: 当我们讨论浮点数的取值范围时, 实际上讨论的是: normal number (上图中绿色部分)的范围.

可以看出, 32位浮点数的 指数部分 其实是无法取到-127和128的, 因为:

用于表示 -127 的 0000 0000 被用来表示 subnormal number 了,

而用于表示 128 的 1111 1111 被用来表示 non-number 了.

所以实际上32位浮点数的指数部分只能取到只能取到[-126, 127]

再来看看尾数: 对于normal number, 尾数前隐藏的整数部分始终保持为 1.

所以尾数(含隐藏的整数部分)所表示的值的范围其实是 [1.00…00, 1.11…11],

这个二进制数, 约等于十进制的[1, 2), 因为1.11..11非常逼近十进制的2

好啦, 现在我们知道, 对于32位flaot而言: 尾数(含隐藏的整数部分)的可取值为: [1 ,2), 指数位可取值[-126, 127], 且浮点数可正可负, 根据运算规则, 就不难算出32位float的取值范围了:

取值范围

注意开闭区间哦

然后为了看着顺眼, 我们把上式的以2为底, 替换为以10为底:

↑ 转换后小数位太长了, 所以这里写成了省略号的形式: 3.402823669 …

从上面这个集合中, 取一个更容易表示的子集, 就是我们常见的32位float的取值范围了:

↑ 注意, 上面这个集合其实是32位float取值范围的子集, 不过和真正的取值范围也没有差太多, 表示起来也更简洁, 没有冗长的小数位, 还能写成闭区间的形式…所以在各种资料中, 我们常看到的取值范围就是上面这个.

↑ 之所以能写成 闭 区间的形式, 就是因为它只是真正取值范围的一个 子集. 这里特意说明一下, 防止有的同学对这里的闭区间感到困惑.

下面是 32位单精度浮点数的取值范围示意图, 可以参照此图更好的理解一下前文内容

下图中, x轴代表以2为底的n次幂(即内存中的指数部分), y轴代表尾数(含隐藏的整数部分1.)

坐标系中任意一点(x, y)就代表一个浮点数,

这一点到x轴, y轴所围成的矩形的面积(即上图中橙色区域的面积), 就是这个浮点数的值 (即浮点数的值 = 尾数(含隐藏的整数部分) * 以2为底的n次幂)

上图中:

蓝色部分: 表示normal number的取值范围, 即, normal number类型的浮点数对应的坐标点只能出现在坐标系中的蓝色区域.

坐标点: 一个坐标点对应一个浮点数

橙色部分的面积: 表示该浮点数的值.

这就是32位浮点数取值范围的计算方法.

下一章将详细介绍为什么说32位浮点数的精度是”7位有效数”, 这个7是怎么计算出来的, 下一章也将会是整个系列中最有难度, 最重要的一章.

那下一章再见吧~

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。