1. 程式人生 > >計算機中浮點數的表示,IEEE 754標準

計算機中浮點數的表示,IEEE 754標準

IEEE Standard for Floating-Point Arithmetic(IEEE 754,Institute of Electrical and Electronics Engineers)是1985年建立的浮點數計算的技術標準。解決了原來浮點數實現不一致的問題,許多硬體浮點數處理單元使用IEEE 754標準。

1 基本和交換格式(basic and interchange format)

IEEE 754定義了5種基本格式,binary32也叫單精度(single-precision),binary64也叫雙精度(double precision)。
這裡寫圖片描述

2 單精度浮點數(Single-precision floating-point format,binary32)

一個binary32包括,1(符號位,sign bit) + 8(指數位,exponent width) + 24(有效精度,significand precision),明確的significand是23位。
單精度浮點數格式
注意下面的值:
1 + 2

23 1.000   000   119 1 + 2^{-23} \approx 1.000\ 000 \ 119

2 2 23 1.999   999   881 2 - 2^{-23} \approx 1.999\ 999\ 881
2 126 1.175   494   35 × 1 0 38 2^{-126} \approx 1.175\ 494\ 35 \times 10^{-38}
2 + 127 1.704   411   83 × 1 0 + 38 2^{+127} \approx 1.704\ 411\ 83 \times 10^{+38}

計算公式,指數需要減127,小數位需要加1(湊夠24位)
v a l u e = ( 1 ) s i g n × 2 e 127 × ( 1 + i = 1 23 b 23 i 2 i ) value = (-1)^{sign} \times 2^{e - 127} \times \left(1 + \sum_{i=1}^{23}b_{23-i}2^{-i}\right)
上圖中:
v a l u e = ( 1 ) 0 × 2 3 × 1.25 = 0.15625 value = (-1)^0 \times 2^{-3} \times 1.25 = 0.15625

  • 指數位編碼(exponent encoding)

指數位編碼採用offset-binary表示,binary32的0偏移(zero offset)127,在IEEE 754標準中也叫exponent bias

為了得到真實的exponent,計算時e需要減去127。指數位範圍為-126 ~ +127,即0111 1111表示指數位是127 - 127 = 0。指數位0000 00001111 1111有特殊含義。
這裡寫圖片描述
0000 0000時,significand = 0,此時value = 0(也可能是-0)。significand != 0,此時significand不再加1,表示非常小(接近0)的數字。
1111 1111時,significand = 0,此時value = infinity(也可能是-infinity)。significand != 0,此時value = NaN

Decimal digits是: 24 × l o g 10 2 7.22 24\times log_{10}2 \approx 7.22
Decimal E max是: 127 × l o g 10 2 38.23 127\times log_{10}2\approx 38.23
最小的正常正數是: 2 126 1.18 × 1 0 38 2^{-126} \approx 1.18 \times 10^{-38}
最小的正數(指數位全0)是: 2 149 1. 4 45 2^{-149} \approx 1.4^{-45}
最大正數是: ( 2 2 23 ) × 2 127 3.4 × 1 0 38 (2 - 2^{-23}) \times 2^{127} \approx 3.4\times10^{38}

3 雙精度浮點數(Double-precision floating-point format, Binary64)

一個binary64包括,1(符號位,sign bit) + 11(指數位,exponent width) + 53(有效精度,significand precision),明確的significand是52位。
雙精度浮點數

注意下面的值:
2 52 2.2 × 1 0 16 2^{-52} \approx 2.2 \times 10^{-16}
2 1022 2.2 × 1 0 308 2^{-1022} \approx 2.2 \times 10^{-308}
2 + 1023 9.0 × 1 0 + 307 2^{+1023} \approx 9.0 \times 10^{+307}

計算公式,指數需要減1023,小數位需要加1(湊夠53位)
v a l u e = ( 1 ) s i g n × 2 e 1023 × ( 1 + i = 1 52 b 52 i 2 i ) value = (-1)^{sign} \times 2^{e - 1023} \times \left(1 + \sum_{i=1}^{52}b_{52-i}2^{-i}\right)

Binary64的指數位編碼(exponent encoding)的0偏移(zero offset)1023,指數位範圍為-1022 ~ +1023,即0111 1111表示指數位是127 - 127 = 0。指數位 000 0000 0000111 1111 1111有特殊含義,參考Binary32。

Decimal digits是: 24 × l o g 10 2 15.95 24\times log_{10}2 \approx 15.95
Decimal E max是: 127 × l o g 10 2 307.95 127\times log_{10}2\approx 307.95
最小的正常正數是: 2 1022 2.2 × 1 0 308 2^{-1022} \approx 2.2 \times 10^{-308}
最小的正數(指數位全0)是: 2 1074 5 324 2^{-1074} \approx 5^{-324}