IEEE Standard for Floating-Point Arithmetic(IEEE 754,Institute of Electrical and Electronics Engineers)是1985年建立的浮点数计算的技术标准。解决了原来浮点数实现不一致的问题,许多硬件浮点数处理单元使用IEEE 754标准。
IEEE 754定义了5种基本格式,binary32也叫单精度(single-precision),binary64也叫双精度(double precision)。
一个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−23≈1.000 000 119,
2 − 2 − 23 ≈ 1.999 999 881 2 - 2^{-23} \approx 1.999\ 999\ 881 2−2−23≈1.999 999 881,
2 − 126 ≈ 1.175 494 35 × 1 0 − 38 2^{-126} \approx 1.175\ 494\ 35 \times 10^{-38} 2−126≈1.175 494 35×10−38,
2 + 127 ≈ 1.704 411 83 × 1 0 + 38 2^{+127} \approx 1.704\ 411\ 83 \times 10^{+38} 2+127≈1.704 411 83×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) value=(−1)sign×2e−127×(1+i=1∑23b23−i2−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 value=(−1)0×2−3×1.25=0.15625
指数位编码采用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 24×log102≈7.22
Decimal E max是: 127 × l o g 10 2 ≈ 38.23 127\times log_{10}2\approx 38.23 127×log102≈38.23
最小的正常正数是: 2 − 126 ≈ 1.18 × 1 0 − 38 2^{-126} \approx 1.18 \times 10^{-38} 2−126≈1.18×10−38
最小的正数(指数位全0)是: 2 − 149 ≈ 1. 4 − 45 2^{-149} \approx 1.4^{-45} 2−149≈1.4−45
最大正数是: ( 2 − 2 − 23 ) × 2 127 ≈ 3.4 × 1 0 38 (2 - 2^{-23}) \times 2^{127} \approx 3.4\times10^{38} (2−2−23)×2127≈3.4×1038
一个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−52≈2.2×10−16,
2 − 1022 ≈ 2.2 × 1 0 − 308 2^{-1022} \approx 2.2 \times 10^{-308} 2−1022≈2.2×10−308,
2 + 1023 ≈ 9.0 × 1 0 + 307 2^{+1023} \approx 9.0 \times 10^{+307} 2+1023≈9.0×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) value=(−1)sign×2e−1023×(1+i=1∑52b52−i2−i)
Binary64的指数位编码(exponent encoding)的0偏移(zero offset)
是1023
,指数位范围为-1022 ~ +1023
,即0111 1111
表示指数位是127 - 127 = 0
。指数位 000 0000 0000
和111 1111 1111
有特殊含义,参考Binary32。
Decimal digits是: 24 × l o g 10 2 ≈ 15.95 24\times log_{10}2 \approx 15.95 24×log102≈15.95
Decimal E max是: 127 × l o g 10 2 ≈ 307.95 127\times log_{10}2\approx 307.95 127×log102≈307.95
最小的正常正数是: 2 − 1022 ≈ 2.2 × 1 0 − 308 2^{-1022} \approx 2.2 \times 10^{-308} 2−1022≈2.2×10−308
最小的正数(指数位全0)是: 2 − 1074 ≈ 5 − 324 2^{-1074} \approx 5^{-324} 2−1074≈5−324
最大正数是: ( 2 − 2 − 52 ) × 2 1023 ≈ 1.8 × 1 0 308 (2 - 2^{-52}) \times 2^{1023} \approx 1.8\times10^{308} (2−2−52)×21023≈1.8×10308
参考:
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