首页 > 编程知识 正文

双浮点精度,双浮点精度型格式

时间:2023-05-04 05:25:14 阅读:228794 作者:973

关于IEEE 754标准下的浮点数

(全文以64位为例,规定64位中包括1位符号位,11位阶码和52位尾数)

1.符号位

没什么可说的,一位,分正负罢了。

2.阶码

阶码由于偏移量的存在,其值会被加上1023(在IEEE754中特殊规定的,纯粹为了方便计算)。
例如:
如果本来是2的5次方,那么转换后将会是1028,即(10000000100)2;
如果是2的-1次方,转换后将会是1022,即(01111111110)2。

那么阶码的取值,在0至2047之间。其中,0和2047是特别的,如果是2047,那么无论尾数是多少,这个数都是无穷大,即溢出。而当阶码是0时,将分开另讲。

3.尾数 (1)一般情况,也称规格化情况

在阶码为1至2046时,尾数前有一位隐藏位,默认置1,小数点默认在尾数第一位之前
例如:
尾数为0000…000(52个0),那么实际上表示的数是1.000…000(52个0);
尾数为101010000…0(自行凑52位吧),那么实际上表示的是1.101010000…0。
这么做的原因自然是能多一位,更精确。

至此,可以得知:阶码为1至2046(即不是全0或全1时),一个64位浮点数的值是:
(1.尾数)×2(阶码-1023)(记得看符号位分正负)

(2)特殊情况,非规格化

阶码为0的情况
此时尾数前无隐藏位,小数点默认在尾数第一位与第二位之间
例如:
尾数为100…0(51个0)表示(1.00…0)2(51个0)而不是(1.100…0)2(51个0),不再具有隐藏位。
尾数为00…001(51个0)表示(0.000…0001)2=2-51,小数点后仍然是51个0,而不是(1.00…001)2也不是(0.00…001)2=2-52(不是小数点后52个0)。
至此,可以得知,阶码为全0时,64位浮点数的值是:
(小数点加在一二位之间的尾数)×2-1023

阶码全1的情况
认为此数超出上界,溢出。

4.结论

由上边的分析可以最终得出:

绝对值最小值:阶码全0,尾数为00…01(51个0)时,对应的值是(0.00…01)2×2-1023(小数点后50个0),即2(-51-1023)=4.94e-324约为5×10-324

绝对值最大值:阶码为11…10,尾数全1时,对应的值是(1.11…1)2×21023(小数点后52个1),即
(2-2-52)×21023=1.7977e+308约为1.8×10308

需要注意的是,若要使用浮点数表示整数,仅能表示到(1.11…1)2×252(小数点后52个1),即
253-1=9007199254740991,约为9×10^15,并不像某些一知半解的人所谓“double根本不能表示任何整数”,也不是任何时候都使用double都可以,不过它至少比int大,但显然没有也不应该有long大(毕竟都是64位)。
由于只有尾数拥有精确度,阶码仅能表示数量级,故认为其最小精度为2-52,约为2.22×10-16。(并不是说其表示的数与数之间的间隔是10-16,这太可笑了)个人认为,是在阶码相当的情况下,数与数之间的相对间隔,这种类似的概念。

老生常谈:绝对值超出上界上溢,溢出处理报错;绝对值超出下界下溢,按机器0处理,不报错。

double拥有0与-0,符号位分别为0和1,其余位全0。编码上是有区别的,c++中计算1.0/0.0和1.0/-0.0分别得到INFINITY与–INFINITY,或许这就是其根本原因。

参考:

https://www.boatsky.com/blog/26
https://blog.csdn.net/abcdu1/article/details/75095781
(第二篇里推荐的工具很好用,贴过来嘻嘻)
进制转换工具:
http://tool.oschina.net/hexconvert/
单精度浮点数内存中编码:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
双精度浮点数内存中编码:
http://www.binaryconvert.com/convert_double.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。