float类型的二进制表示方法

Posted StormWendy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了float类型的二进制表示方法相关的知识,希望对你有一定的参考价值。

摘自:http://www.duote.com/tech/5/14691.html

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
  V = (-1)^s×M×2^E
  (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
  (2)M表示有效数字,大于等于1,小于2。
  (3)2^E表示指数。

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是阶码E,剩下的23位为有效数字M。

符号位S 阶码(E+偏移量) 尾数M
1位 8位 23位


(1)尾数M

前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

(2)阶码

阶码 = 指数 E+  偏移量,这种阶码表示方式为移码。据猜测在计算机中存储的是阶码,实际求值的时候需要减去偏移量。

阶码为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255,但有下面的情况:

  • 当阶码为全0且尾数M也为全0时,表示的真值X为零,结合符号位S为0或1,有正零和负零之分。
  • 当阶码为全1且尾数M也为全0时,表示的真值X为无穷大(∞),结合符号位S为0或1,有+∞和-∞之分。如果M不全位0,表示这不是一个数(NaN)。

除去E用全0和全1(255)表示零和无穷大的特殊情况,因此,阶码的取值范围变为1~254,为了表示小数,设置偏移量为127,那么实际表达的数值的指数范围为-126 ~ +127.

求浮点数最大表示的整数是多少:

那么,根据X = (-1) s ×(1.M)×2  E-127   ,有
最大值为 (1.11111.....1)2 ×2127 =(1+1-2-23) ×2 127 = (2-2 -23) ×2 127 = 2128-2-104

作者:牛客2862122号
链接:https://www.nowcoder.com/questionTerminal/68eb1274b8ed4ead8d1b3b27a0c54b8b
来源:牛客网

以上是关于float类型的二进制表示方法的主要内容,如果未能解决你的问题,请参考以下文章

float类型和double类型的二进制存储

怎么把float型转换成int

如何理解IEEE 754标准对Java中float值和double值的规定

float型怎样强制转换成int型

mysql往数据库插入float类型的数据 为啥数字不对?

Float计算机表示形式