造冰箱的大熊猫@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,表示NaN(Not-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