版权声明:本文为个人知识整理,欢迎指正、交流、转载。 https://blog.csdn.net/u014711094/article/details/80614594
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
1 + 2 − 2 3 ≈ 1 . 0 0 0 0 0 0 1 1 9 ,
2
−
2
−
23
≈
1.999
999
881
2 - 2^{-23} \approx 1.999\ 999\ 881
2 − 2 − 2 3 ≈ 1 . 9 9 9 9 9 9 8 8 1 ,
2
−
126
≈
1.175
494
35
×
1
0
−
38
2^{-126} \approx 1.175\ 494\ 35 \times 10^{-38}
2 − 1 2 6 ≈ 1 . 1 7 5 4 9 4 3 5 × 1 0 − 3 8 ,
2
+
127
≈
1.704
411
83
×
1
0
+
38
2^{+127} \approx 1.704\ 411\ 83 \times 10^{+38}
2 + 1 2 7 ≈ 1 . 7 0 4 4 1 1 8 3 × 1 0 + 3 8
计算公式,指数需要减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 ) s i g n × 2 e − 1 2 7 × ( 1 + i = 1 ∑ 2 3 b 2 3 − i 2 − i ) 上图中:
v
a
l
u
e
=
(
−
1
)
0
×
2
−
3
×
1.25
=
0.15625
value = (-1)^0 \times 2^{-3} \times 1.25 = 0.15625
v a l u e = ( − 1 ) 0 × 2 − 3 × 1 . 2 5 = 0 . 1 5 6 2 5
指数位编码采用offset-binary
表示,binary32的0偏移(zero offset)
是127
,在IEEE 754标准中也叫exponent bias
。
为了得到真实的exponent,计算时e需要减去127。指数位范围为-126 ~ +127
,即0111 1111
表示指数位是127 - 127 = 0
。指数位0000 0000
和1111 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
2 4 × l o g 1 0 2 ≈ 7 . 2 2 Decimal E max是:
127
×
l
o
g
10
2
≈
38.23
127\times log_{10}2\approx 38.23
1 2 7 × l o g 1 0 2 ≈ 3 8 . 2 3 最小的正常正数是:
2
−
126
≈
1.18
×
1
0
−
38
2^{-126} \approx 1.18 \times 10^{-38}
2 − 1 2 6 ≈ 1 . 1 8 × 1 0 − 3 8 最小的正数(指数位全0)是:
2
−
149
≈
1.
4
−
45
2^{-149} \approx 1.4^{-45}
2 − 1 4 9 ≈ 1 . 4 − 4 5 最大正数是:
(
2
−
2
−
23
)
×
2
127
≈
3.4
×
1
0
38
(2 - 2^{-23}) \times 2^{127} \approx 3.4\times10^{38}
( 2 − 2 − 2 3 ) × 2 1 2 7 ≈ 3 . 4 × 1 0 3 8
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 − 5 2 ≈ 2 . 2 × 1 0 − 1 6 ,
2
−
1022
≈
2.2
×
1
0
−
308
2^{-1022} \approx 2.2 \times 10^{-308}
2 − 1 0 2 2 ≈ 2 . 2 × 1 0 − 3 0 8 ,
2
+
1023
≈
9.0
×
1
0
+
307
2^{+1023} \approx 9.0 \times 10^{+307}
2 + 1 0 2 3 ≈ 9 . 0 × 1 0 + 3 0 7
计算公式,指数需要减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)
v a l u e = ( − 1 ) s i g n × 2 e − 1 0 2 3 × ( 1 + i = 1 ∑ 5 2 b 5 2 − i 2 − i )
Binary64的指数位编码(exponent encoding)的0偏移(zero offset)
是1023
,指数位范围为-1022 ~ +1023
,即0111 1111
表示指数位是127 - 127 = 0
。指数位 000 0000 0000
和111 1111 1111
有特殊含义,参考Binary32。
扫描二维码关注公众号,回复:
4312282 查看本文章
Decimal digits是:
24
×
l
o
g
10
2
≈
15.95
24\times log_{10}2 \approx 15.95
2 4 × l o g 1 0 2 ≈ 1 5 . 9 5 Decimal E max是:
127
×
l
o
g
10
2
≈
307.95
127\times log_{10}2\approx 307.95
1 2 7 × l o g 1 0 2 ≈ 3 0 7 . 9 5 最小的正常正数是:
2
−
1022
≈
2.2
×
1
0
−
308
2^{-1022} \approx 2.2 \times 10^{-308}
2 − 1 0 2 2 ≈ 2 . 2 × 1 0 − 3 0 8 最小的正数(指数位全0)是:
2
−
1074
≈
5
−
324
2^{-1074} \approx 5^{-324}
2 − 1 0 7 4 ≈ 5 − 3 2 4 最大正数是:
(
2
−
2
−
52
)
×
2
1023
≈
1.8
×
1
0
308
(2 - 2^{-52}) \times 2^{1023} \approx 1.8\times10^{308}
( 2 − 2 − 5 2 ) × 2 1 0 2 3 ≈ 1 . 8 × 1 0 3 0 8
参考: https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats https://en.wikipedia.org/wiki/Single-precision_floating-point_format https://en.wikipedia.org/wiki/Double-precision_floating-point_format