C++浮点型的存储方式详解
浮点型及其存储方式
有些时候需要变量能存储带小数点的数,或者能存储极大数或极小数。这类数可以用浮点(因小数点是“浮动的”而得名)格式进行存储。C语言提供了3种浮点类型,对应三种不同的浮点格式。
当精度要求不严格时(小数点后少于六位),float类型是很适合的类型。double提供更高的精度, 对绝大多数程序来说够用了。longdouble支持极高精度的要求,很少会用到。
C标准没有说明float、double和long double类型提供的的精度到底是多少,因为不同计算机可以用不同方法存储浮点数。大多数现代计算机遵循IEEE754标准(即IEC 60559) 的规范,所以这里也将它作为一个示例。
一、IEEE浮点标准
由IEEE开发的IEEE标准提供了两种主要的浮点数格式:单精度(32位) 和双精度(64位)。数值以科学记数法的形式存储,每一个数都由三部分组成:符号、指数和小数。指数部分的位数说明了数值的可能大小程度,而小数部分的位数说明了精度。单精度格式中,指数长度为8位,而小数部分占了23位。因此,单精度数可以表示的最大值大约是3.40×1038,其中精度是6个十进制数字。
IEEE标准还描述了另外两种格式:单扩展精度和双扩展精度。标准没有指明这些格式中的位数,但要求单扩展精度类型至少为43位,而双扩展精度类型至少为79位。
类型 | 最小值 | 最大值 | 精度 | 备注 |
---|---|---|---|---|
●float | 1.175 49×10-38 | 3.402 82×1038 | 小数点后6位 | 单精度32位 |
●double | 2.225 07×10-308 | 1.797 69×10308 | 小数点后15位 | 双精度64位 |
上表给出了根据IEEE标准实现的浮点类型特征。[表中给出了规范化的最小正值, 非规范化的数可以更小。] long double类型没有显示在此表中, 因为它的长度随着机器的不同而变化,而最常见的大小是80位和128位。
二、存储方式
对于浮点型数据,首先我们需要明白的一点是:浮点数和整型数的编码方式是不一样的,IEEE浮点标准采用如下形式来标识一个浮点数。
V = (-1)S M 2E
- (-1)S 表示符号位,当S=0时,表示正数,当S=1时,表示负数。
- M 表示有效数字,是一个二进制小数,其值大于等于1,小于2。
- 2E 表示指数位。
下面,我将用float作为例子,double道理也是一样的,只是位数有所不同。
例如:十进制数:88.8125 —> 二进制为:101 1000.1101
然后将101 1000.1101化成上述公式M的形式,其范围是[1,2),所以将小数点左移6位,得到1.0110001101×26(这里不懂的话对比十进制,小数点左移一位乘以10,二进制则乘以2)。
最后得到S = 0、M = 1.0110001101、E = 6,但是事情并没有那么简单,我们接着往下看。
IEEE 754对有效数字M和指数E的规定。
1、有效数字M:
1<=M<2,也就是说,M写成1.xxx……的形式,其中xxx……表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存小数部分。比如保存1.0110001101时,只保存0110001101,后面的位数补0就可以了,等到读取的时候,再把第一位的1补上去。
2、指数E:
首先,E为一个无符号整数(unsigned int)
如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法是可以出现负数的,所以IEEE 754规定,存入内存的E是真实值加上一个中间数,对于8位的E,中间数是127,对于11位的E,中间数是1023。比如,26 的E是6,所以保存为32位浮点数时,必须保存为6+127=133,即10000101。
重点:
结合上述补充的信息完善例子
float:
十进制数:88.8125 二进制为:101 1000.1101 == 1.0110001101×26
- 符号位:0
- 指数位:6+127=133 二进制为:1000 0101
- 小数位:1.0110001101去掉最高位1则为:0110001101
因此浮点数88.8125的IEEE浮点表示为:
----0----1000 0101----011 0001 1010 0000 0000 0000
符号位- -指数域- - - - - - - - - - -小数域
根据指数域不同取值分为一下三种情况:
1)E不全为0或不全为1(规格化值)
这是最常见情况,取出内存中的数时,指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
2)E全为0(非规格化值)
这时,浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxxx的小数。这样做是为了表示正负零,以及接近于0的很小的数字。
举个例子:编码为如下情形:
0 0000 0000 000 0000 0000 0000 0000 0001
即2(-23)×2(-126)=2(-149),转成10进制大约等于1.4×10(-45),这就是单精度所能表达最小的正数了。
3)E全为1(特殊数值)
当指数域全为1时属于这种情形。此时,如果小数域全为0且符号域S=0,则表示正无穷,如果小数域全为0且符号域S=1,则表示负无穷。如果小数域不全为0时,浮点数将被解释为NaN, 即不是一个数(Not a Number) 。比如计算负数平方根或处理未初始化数据时。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了Vue基于localStorage存储信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-16
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25