当前位置:首页 » 服务存储 » 浮点数的754标准存储合适
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

浮点数的754标准存储合适

发布时间: 2023-01-19 03:50:35

① 什么是单精度和双精度浮点数

单精度与双精度的区别:

1、单精度,也就是 float ,在 32 位机器上用 4 个字节来存储的;而双精度double是用 8 个字节来存储的。

2,单精度和双精度在计算机中的表示格式虽一样,但由于位数存储位不同,他们能表示的数值的范围就不同,也就是能准确表示的数的位数就不同。

拓展资料:

单精度

单精度数是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。

双精度浮点数

双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:2.23x10-308~ 1.79x10308。IEEE754为其定制标准。

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

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

本章主要参考自 IEEE754 wiki

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

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

或者说是:

直观表示的话就是:

[-, -0.] ∪ [0., ]

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

而且此处假定你已经对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是怎么计算出来的, 下一章也将会是整个系列中最有难度, 最重要的一章.

那下一章再见吧~

③ 浮点数的取值范围用二进制表示的

目前多数系统都按照ieee-754标准来规定浮点数的存储格式。ieee754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储,分为三个部分:符号位、阶码和尾数。阶码即指数,尾数即有效小数位数。单精度格式阶码占8位,尾数占24位,符号位1位,双精度则为11位阶码,53位尾数和1位符号位,
显然差别就出来了。即使都是4字节存储的单精度浮点数,还有不使用ieee754标准的,我记得字长32位的大型ibm系列机就是1位符号位,24位尾数,7位阶码,基数16,而不是2,与此标准不同。所以浮点数的表示范围依赖的因素较多较复杂,主要取决于表示一个浮点数所用的字节数和阶码的大小与长度。说法不一样,但应该都是有根据的。

④ 若浮点数点的IEEE-754 标准存储格式为41D4C000H,求该浮点数的十进制值,要求给出具体过程

[例1]若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值.
将16进制展开后,可得二进制数格式为
0 100,0001,0 011,0110,0000,0000,0000,0000
S E M
指数e=100,0001,0-01111111=00000011=(3)10
包含隐藏位1的尾数1.M=1.011,0110,0000,0000,0000,0000
于是有 x=(-1)^0*(1.M)*2^(E-127)
=+(1.011011)2*2^3
=(11.375)10

⑤ 若浮点数x的 十进制真值如下:请求出IEEE754标准存储格式 1) -3.125

IEEE754 学习总结一:前言二:预备知识三:将浮点格式转换成十进制数四:将十进制数转换成浮点格式(real*4)附:IEEE754 Converte 1.0介绍一:前言前不久在分析一个程序的过程中遇到了浮点运算,也就顺便学习了一下浮点数的存放格式(IEEE754标准),此文仅作为总结,其中举了几个典型的例子,如果你想深入了解IEEE754标准,我想本文并不太适合您.二:预备知识-----------------------------------------------------------------------值 存储为 指数偏移量real*4 1位符号位(s)、8位指数(e),23位尾数(m,共32位) 127(7FH)real*8 1位符号位(s)、11位指数(e),52位尾数(m,共64位) 1023(3FFH)real*10 1位符号位(s)、15位指数(e),64位尾数(m,共80位) 16383(3FFFH)-----------------------------------------------------------------------计算公式:V=(-1)^s*2^E*M当e(各位)为全'0'时,E=1-(2^(e(位数)-1)-1),;M=m.如:real*4是8位,E=1-(2^(8-1)-1)=1-127=-126即,在real*4时:V=(-1)^s*2^(-126)*m在real*8时:V=(-1)^s*2^(-1022)*m当e(各位)不为全'0'且不为全'1'时,E=e(值)-(2^(e(位数)-1)-1);M=1+m.即,在real*4时:V=(-1)^s*2^(e(值)-127)*(1+m)在real*8时:V=(-1)^s*2^(e(值)-1023)*(1+m)三:将浮点格式转换成十进制数[例3.1]:0x00280000(real*4)转换成二进制符号位 指数部分(8位) 尾数部分0 00000000 01010000000000000000000符号位=0;因指数部分=0,则:尾数部分M为m:0.01010000000000000000000=0.3125该浮点数的十进制为:(-1)^0*2^(-126)*0.3125=3.-39[例3.2]:0xC04E000000000000(real*8)转换成二进制符号位 指数部分(11位) 尾数部分1 10000000100 符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.=1.875该浮点数的十进制为:(-1)^1*2^(1028-1023)*1.875=-60四:将十进制数转换成浮点格式(real*4)[例4.1]:26.0十进制26.0转换成二进制11010.0规格化二进制数1.10100*2^4计算指数4+127=131符号位 指数部分 尾数部分0 10000011 10100000000000000000000以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 00000x41D0 0000[例4.2]:0.75十进制0.75转换成二进制0.11规格化二进制数1.1*2^-1计算指数-1+127=126符号位 指数部分 尾数部分0 01111110 10000000000000000000000以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 00000x3F40 0000[例4.3]:-2.5十进制-2.5转换成二进制-10.1规格化二进制数-1.01*2^1计算指数1+127=128符号位 指数部分 尾数部分1 10000000 01000000000000000000000以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 00000xC020 0000附:IEEE754 Converte 1.0介绍用IEEE754 Converte 1.0 转换[例3.2]的截图

⑥ IEEE754标准的单精度浮点数存储形式为如下:求其浮点数的十进制真值.

按照IEEE-754标准规定,单精度浮点数用4字节存储,分为三个部分:符号位S、阶E和尾数D。阶即指数,尾数即有效小数位数。单精度格式阶占8位,尾数占24位(归一化数据去首位1结果为23位),符号位1位,换算公式为Data = S * 2^(E-127) * (D)。


==>
1100 0001 1110 0000 0000 0000 0000 0000
==>
1位 8位 23位
S E D'(归一化去1结果)
1 100 0001 1 110 0000 0000 0000 0000 0000
1 1000 0011 110 0000 0000 0000 0000 0000
1 1000 0011 0.110 0000 0000 0000 0000 0000
==>
S E D(补1.还原归一化结果)
1 1000 0011 1+0.110 0000 0000 0000 0000 0000
1 8 3 1+0.110 0000 0000 0000 0000 0000
==>
二进制小数 0.11B => 十进制 0.5 + 0.25 = 0.75
S E D整数(2进制) D小数(2进制)
1 8 3 1+0.110 0000 0000 0000 0000 0000
1 0x83 1.110 0000 0000 0000 0000 0000
1 0x83 1 + 0.110 0000 0000 0000 0000 0000
1 131 1 + 0.75
1 131 1.75
==》
S E D
1 131 1.75
=>二进制纯小数
Data = S * 2^(E-127) * (D)
= (-1) * 2^(131-127) * (1.75)
= (-1) * (2^4) * (1.75)
= -1 * 16 * 1.75
= - 28.0

⑦ IEEE754是什么

IEEE754代码
标准表示法
为便于软件的移植,浮点数的表示格式应该有统一标准(定义)。1985年IEEE(Institute of Electrical and Electronics Engineers)提出了IEEE754标准。该标准规定基数为2,阶码E用移码表示,尾数M用原码表示,根据原码的规格化方法,最高数字位总是1,该标准将这个1缺省存储,使得尾数表示范围比实际存储的一位。实数 的IEEE754标准的浮点数格式为:
具体有三种形式:
表3 IEEE754三种浮点数的格式参数
浮点数
类型 存储位数 偏移值( )
阶码E的取值范围 真值表达式
数符(s) 阶码(E) 尾数(M) 总位数 十六进制 十进制
短实数 1 8 23 32 7FH 127 1~254
长实数 1 11 52 64 3FFH 1023 1~2046
临时实数 1 15 64 80 3FFFH 16383 1~32766
对于阶码为0或为255(2047)的情况,IEEE有特殊的规定。
在浮点数总位数不变的情况下,其精度值与范围值是矛盾的,因此一般的机器都提供有单、双精度两种格式。表4中列出了IEEE754单精度浮点数的表示范围,对于双精度只需要修改一下偏移值和尾数位数即可。
表4 IEEE754单精度、双精度浮点数范围
典型范围 浮点数代码 真 值
数符(Ms) 阶码(E) 尾数(M)
最大正数
最小正数
绝对值最大的负数
绝对值最小的负数 0
0
1
1 11111110
00000001
11111110
00000001 11………11
00………00
11………11
00………00
标准浮点数的存储格式与图1(b)相似,只是在尾数中隐含存储着一个1,因此在计算尾数的真值时比一般形式要多一个整数1。对于阶码E的存储形式因为是 127的偏移,所以在计算其移码时与人们熟悉的128偏移不一样,正数的值比用128偏移求得的少1,负数的值多1,为避免计算错误,方便理解,常将E当成二进制真值进行存储。例如:将数值-0.5按IEEE754单精度格式存储,先将-0.5换成二进制并写成标准形式:-0.510=-0.12=-1.0×2-12,这里s=1,M为全0,E-127=-1,E=12610=011111102,则存储形式为:
1 01111110 000000000000000000000000=BE00000016
这里不同的下标代表不同的进制。

⑧ 若浮点数x的754标准存储格式为(C93B0000)(16)求其浮点数的十进制数值

1 转化为2进制

12.5(10)= 1100.1(2) = 1.1001x 2^3 (2)
2 计算阶码,单精度附点
E = 127 + 3= 130 = 10000010 (2)
3 整理尾数,23位,去掉整数部分的1
10010000000000000000000
4 加上符号位,得到32位浮点数
0 10000010 10010000000000000000000
5 写成16进制
12.5 = 0x41480000(f)

-12.5符号位为1
-12.5= 0xC1480000(f)