位结构
float 各部分的含义
- 符号位:
- 为 0 表示正数,为 1 表示负数。
- 指数部分:
- 指数部分是一个移码。
- 指数部分有 8 位,首先当成无符号整型,则值域是
[0, 255]
. - 因为是移码,所以
移码值 = 无符号整型值 - 127
则移码值的值域为[-127, 128]
. - 但是浮点的指数部分不是标准的移码,没有 -127 这个值。当指数部分全 0 时,标准移码的值是 -127, 但是浮点中把它当成 -126, 表示非规格化数。
- 在规格化数中,指数部分的无符号整型值减去 127 就是实际的指数值。
- 在非规格化数中,指数位全为 0,指数值为 -126,不再是指数部分的无符号整型值减去 127.
- 此外,当指数部分的所有位都为 1 时,不再是表示具体的小数值,而是表示
无穷
、NaN
这种抽象的值。指数部分全 1 时,标准的移码值是 128, 但是浮点中表示抽象值。所以浮点的指数部分在表示具体的小数时的指数值的值域为[-126, 127]
.
- 尾数部分:
- 尾数部分有 23 位,是一个无符号整型。
double 各部分的含义
- 符号位:
- 为 0 表示正数,为 1 表示负数。
- 指数部分:
- 指数部分是一个移码。
- 指数部分有 11 位,首先当成无符号整型,则值域是
[0, 2047]
. - 因为是移码,所以
移码值 = 无符号整型值 - 1023
则移码值的值域为[-1023, 1024]
. - 但是浮点的指数部分不是标准的移码,没有 -1023 这个值。当指数部分全 0 时,标准移码的值是 -1023, 但是浮点中把它当成 -1022, 表示非规格化数。
- 在规格化数中,指数部分的无符号整型值减去 1023 就是实际的指数值。
- 在非规格化数中,指数位全为 0,指数值为 -1022,不再是指数部分的无符号整型值减去 1023.
- 此外,当指数部分的所有位都为 1 时,不再是表示具体的小数值,而是表示
无穷
、NaN
这种抽象的值。指数部分全 1 时,标准的移码值是 1024, 但是浮点中表示抽象值。所以浮点的指数部分在表示具体的小数时的指数值的值域为[-1022, 1023]
.
- 尾数部分:
- 尾数部分有 52 位,是一个无符号整型。
值计算公式
float 的值计算公式
规格化数的值:
value=(−1)sign×2exponent−127×(1+mantissa223)
\text{value} = (-1)^{\text{sign}} \times 2^{\text{exponent} - 127} \times \left(1 + \frac{\text{mantissa}}{2^{23}}\right)
value=(−1)sign×2exponent−127×(1+223mantissa)
非规格化数的值:
value=(−1)sign×2−126×(mantissa223)
\text{value} = (-1)^{\text{sign}} \times 2^{-126} \times \left(\frac{\text{mantissa}}{2^{23}}\right)
value=(−1)sign×2−126×(223mantissa)
double 的值计算公式
规格化数的值:
value=(−1)sign×2exponent−1023×(1+mantissa252)
\text{value} = (-1)^{\text{sign}} \times 2^{\text{exponent} - 1023} \times \left(1 + \frac{\text{mantissa}}{2^{52}}\right)
value=(−1)sign×2exponent−1023×(1+252mantissa)
非规格化数的值:
value=(−1)sign×2−1022×(mantissa252)
\text{value} = (-1)^{\text{sign}} \times 2^{-1022} \times \left(\frac{\text{mantissa}}{2^{52}}\right)
value=(−1)sign×2−1022×(252mantissa)
浮点特殊值
NaN
- 指数部分所有位都为 1.
- 尾数部分不为 0.
正无穷、负无穷
- 指数部分所有位都为 1.
- 尾数部分所有位都为 0.
则根据符号位来确定是正无穷还是负无穷。符号位为 0 则是正无穷,符号位为 1 则是负无穷。
总结
只要指数部分所有位都为 1, 这个浮点数就不再是具体的小数值,而是 NaN, 无穷 这种抽象的概念。