计算机中浮点数的表示,IEEE 754标准

版权声明:本文为个人知识整理,欢迎指正、交流、转载。 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
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。

扫描二维码关注公众号,回复: 4312282 查看本文章

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}
最大正数是: ( 2 2 52 ) × 2 1023 1.8 × 1 0 308 (2 - 2^{-52}) \times 2^{1023} \approx 1.8\times10^{308}

参考:
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

猜你喜欢

转载自blog.csdn.net/u014711094/article/details/80614594