纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C++浮点型的存储方式 C++浮点型的存储方式详解

Emile_南南沐   2021-09-12 我要评论
想了解C++浮点型的存储方式详解的相关内容吗Emile_南南沐在本文为您仔细讲解C++浮点型的存储方式的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++浮点,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) 比如计算负数平方根或处理未初始化数据时

总结

本篇文章就到这里了希望能够给你带来帮助也希望您能够多多关注的更多内容!


相关文章

猜您喜欢

  • C++ 程序流程结构 C++ 程序流程结构详解

    想了解C++ 程序流程结构详解的相关内容吗最亲密如临大敌在本文为您仔细讲解C++ 程序流程结构的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++,程序流程,C++,结构下面大家一起来学习吧..
  • Java SpringBoot四大核心组件 一篇文章带你了解Java SpringBoot四大核心组件

    想了解一篇文章带你了解Java SpringBoot四大核心组件的相关内容吗不知死活的伪男在本文为您仔细讲解Java SpringBoot四大核心组件的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java,SpringBoot,SpringBoo核心组件下面大家一起来学习吧..

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式