Float类型在内存中的储存形式
根据IEEE 754标准, float 类型通常使用 32 位来在内存中表示一个浮点数。在这32位中,有三个主要部分:符号位,指数部分和位数部分。
存储布局
符号位(S)用于表示数值的正负,位于第一位。指数部分(E)用于表示数值的大小,位于第二到第九位。尾数部分(M)用于表示实际的二进制小数部分,简单来讲就是浮点数有效数字部分用二进制的形式来储存,
//可以这样表示
S | EEEEEEEE | MMMMMMMMMMMMMMMMMMMMMMM
具体解释
1.符号位(S)
如果符号位为0,表示这个浮点数为正数。如果符号位为1,表示这个浮点数为负数。
2.指数部分(E)
小学数学,小数点向左移乘以10的负次幂,小数点向右移乘以10的正次幂。内存中的指数部分就是这个作用,只不过在二进制中是乘以2的N次幂。8位所以它的范围就是0~,这不都是正数吗?只有正次幂啊,那小数点怎么向左移呢?IEEE运用一个巧妙的办法解决了,把指数部分设置成偏移值,实际指数值
=
- 127。
3.尾数部分(M)
尾数部分实际上存储的是二进制小数部分的“规范化”值。规范化意味着尾数部分总是以一个隐含的1开头,即1.M,其中M是尾数部分。对于非规范化的值(指数部分全为0),没有隐含的1。
隐含的“1”
规范化数与非规范化数
1.规范化数
大部分数字都是规范化数,在IEEE 754 标准中规范化数是指能表示成特定形式的数,它的二进制形式最高位总是1。对于单精度浮点数来说,它的形式是1.M。
2.非规范化数
非规范化数非常少,它们的指数部分全为0,这意味着它们值非常非常小,小到平时不太可能用到。它的范围接近0 00000000 00000000000000000000001 ~ 0 00000000 1111111111111111111 1111。
为什么会有隐含的“1”
1.节省储存空间,提高精度
由于大部分浮点数数总是以1开头,所以IEEE 754 认为没有必要在单独分内存来存储这个1,于是就通过次规定该1位隐含值(不占用内存)。这也意味着尾数部分可以表示24位的有效数字,但只需要储存23位。
2.浮点数的唯一性
如果没有隐含的1,那么浮点数就会有多种表示方式,例如,一个数可能表示位0.1011 * 和1.011 *
。这种不唯一性会导致数值运算和比较中的混淆。
3.历史发展
在早期的计算机设计中,不同的机器对浮点数有不同的表示方法。IEEE 754 标准的制定是为了统一浮点数的表示,以解决跨平台计算时的兼容性问题。规范化和隐含的1是这一标准化过程中的重要组成部分。这些规定是基于广泛的计算机工程实践和对精度、效率的平衡考虑而制定的,旨在提高浮点数的计算效率和精度,同时减少存储需求。