位結構
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, 無窮 這種抽象的概念。