IEEE754标准

造冰箱的大熊猫@cnblogs 2021/4/11

 

IEEE754标准规定了浮点数二进制存储数据格式,详情请订阅IEEE标准[1]或网上搜索相关介绍文章[2],这里把程序员编程需要的关键信息小结一下:

 

1、概述

1)IEEE754标准对十进制浮点数如何转换为二进制格式做出了规定,是目前计算机广泛采用的工业标准。

2)IEEE754标准的最新版本为2019版本,废止的版本包括1985和2008版本。

3)IEEE754规定了32位和64位浮点数的数据格式(还有扩展型浮点数,绝大多数程序员不会用到,本文忽略),也就是常说的float(单精度)和double(双精度)型数据类型。

2、float型浮点数

1)采用32位二进制数存储浮点数。其中,

  • bit31为符号位。0~正,1~负。
  • bit[30:23]为指数部分。
  • bit[22:0]为尾数部分。

2)指数部分=全1,尾数部分=全0,表示±无穷大(±Inf),正负号由符号位决定。

3)指数部分=全1,尾数部分≠全0,表示NaNNot-a-Number)。NaN用于表示非数值结果,比如对负数开方(在实数域范围内是无解的)。NaN不区分正负。

4)指数部分≠全1,也≠全0,此时的数值被称为normal number。对于normal number,可以理解为将一个实际数值用“以2为底的科学计数法”表示,即value = ±a×2n。其中,

  • ±为正负号,对应符号位。
  • a为位于[1,2)的实数,等于1.×××。将1省略,将0.×××以二进制形式表达(十进制0.5=2-1=二进制0.1,十进制0.25=2-2=二进制0.01),即为尾数部分。
  • n+127等于指数部分。
  • normal number的取值范围为[-(1-2-24)×2128, -2-126] + [2-126,(1-2-24)×2128]。

5)指数部分=全0,此时的数值被称为subnormal number。与normal number类似,value = ±a×2-126。其中,

  • ±为正负号,对应符号位。
  • a为位于[0,1)的实数,等于0.×××。将0省略,将0.×××以二进制形式表达(十进制0.5=2-1=二进制0.1,十进制0.25=2-2=二进制0.01),即为尾数部分。
  • subnormal number的取值范围为[-(1-2-23)×2-126, (1-2-23)×2-126]。

 看完上面这几段,诸如float型数可存放的最大最小值、为什么某些浮点数无法用float型数据准确描述、float型数的有效位数(精度)等问题自然就弄明白了。

3、double型浮点数

emmmm,与float型类似:

  • 使用64位存储浮点数。
  • bit63为符号位。0~正,1~负。
  • bit[62:52]为指数部分。
  • bit[51:0]为尾数部分。
  • 对于normal number,n+1023等于指数部分,取值范围为[-(1-2-53)×21024, -2-1022] + [2-1022,(1-2-53)×21024]。
  • 对于subnormal number,value = ±a×2-1022,取值范围为[-(1-2-52)×2-1022, (1-2-52)×2-1022]。

参考资料

[1] IEEE 754-2019 - IEEE Standard for Floating-Point Arithmetic @ IEEE

[2] IEEE754标准,连载五篇讲得比较细 @ 简书

原文地址:https://www.cnblogs.com/pandabang/p/14643529.html