计算机中浮点数的表示,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 1+2231.000 000 119
2 − 2 − 23 ≈ 1.999   999   881 2 - 2^{-23} \approx 1.999\ 999\ 881 22231.999 999 881
2 − 126 ≈ 1.175   494   35 × 1 0 − 38 2^{-126} \approx 1.175\ 494\ 35 \times 10^{-38} 21261.175 494 35×1038
2 + 127 ≈ 1.704   411   83 × 1 0 + 38 2^{+127} \approx 1.704\ 411\ 83 \times 10^{+38} 2+1271.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×2e127×(1+i=123b23i2i)
上图中:
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×23×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 24×log1027.22
Decimal E max是: 127 × l o g 10 2 ≈ 38.23 127\times log_{10}2\approx 38.23 127×log10238.23
最小的正常正数是: 2 − 126 ≈ 1.18 × 1 0 − 38 2^{-126} \approx 1.18 \times 10^{-38} 21261.18×1038
最小的正数(指数位全0)是: 2 − 149 ≈ 1. 4 − 45 2^{-149} \approx 1.4^{-45} 21491.445
最大正数是: ( 2 − 2 − 23 ) × 2 127 ≈ 3.4 × 1 0 38 (2 - 2^{-23}) \times 2^{127} \approx 3.4\times10^{38} (2223)×21273.4×1038

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} 2522.2×1016
2 − 1022 ≈ 2.2 × 1 0 − 308 2^{-1022} \approx 2.2 \times 10^{-308} 210222.2×10308
2 + 1023 ≈ 9.0 × 1 0 + 307 2^{+1023} \approx 9.0 \times 10^{+307} 2+10239.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×2e1023×(1+i=152b52i2i)

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 24×log10215.95
Decimal E max是: 127 × l o g 10 2 ≈ 307.95 127\times log_{10}2\approx 307.95 127×log102307.95
最小的正常正数是: 2 − 1022 ≈ 2.2 × 1 0 − 308 2^{-1022} \approx 2.2 \times 10^{-308} 210222.2×10308
最小的正数(指数位全0)是: 2 − 1074 ≈ 5 − 324 2^{-1074} \approx 5^{-324} 210745324
最大正数是: ( 2 − 2 − 52 ) × 2 1023 ≈ 1.8 × 1 0 308 (2 - 2^{-52}) \times 2^{1023} \approx 1.8\times10^{308} (2252)×210231.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

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值