我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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) 。比如计算负数平方根或处理未初始化数据时。

总结

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言浮点型数据在内存中的存储方式是什么

本篇内容介绍了“C语言浮点型数据在内存中的存储方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、思考一下咱们先上一盘开胃菜,试试看
2023-07-05

重学c/c++之数据存储详解(整数、浮点数)

C语言给定了一些基本的数据类型,下面这篇文章主要给大家介绍了关于重学c/c++之数据存储(整数、浮点数)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

详解Android四种存储方式

在Android程序开发中我们经常遇到四种数据存储方式,每种存储方式都各有不同;以下我分别列举了Android开发中的不同存储方式的特点一,PreferencesPreferences是一个较轻量级的存储数据的方法,具体使用方法:在A中保存
2022-06-06

c语言浮点型转换为整型的方法是什么

C语言中浮点型转换为整型的方法有以下几种:1. 强制类型转换:使用强制类型转换运算符将浮点型变量转换为整型变量。例如:```cfloat f = 3.14;int i = (int)f;```2. 四舍五入取整:使用数学函数`round()
2023-08-23

Android开发之数据的存储方式详解

在Android中,数据的存储分为两种方式: 1、直接以文件的形式存储在目录中 2、以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1、生成.txt文件 2、生成xml文件 那么今天就来详细的说一下以文件的形式存储,由于没
2022-06-06

详解C++中存储类的使用

存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。auto、register、static、extern和mutable是C++程序中常用的存储类,本文主要介绍了它们的使用方法,需要的可以参考一下
2022-12-28

Docker存储解决方案:卷与挂载点详解

Docker 提供了多种存储解决方案,其中包括卷(Volume)和挂载点(Bind Mount)。这两种方式都可以用来在容器内持久保存数据,但它们之间有一些重要的区别。下面详细介绍一下这两种存储解决方案的特点和用法。1、卷(Volume)
Docker存储解决方案:卷与挂载点详解
2024-04-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录