float和double类型的内存分布和比较方法

C语言中常见数据类型和对应内存空间大小 double类型:double类型可以存储更为精确的浮点数,和float类型相比,它占用的内存空间更多,通常是8个字节。long类型:long类型也是int类型的一个变体,通常占用4个字节或8个字节的内存空间,具体取决于编译器和操作系统。void类型:void类型可以用来表示没有返回值的函数,也可以用来表示没有类型的指针。short类型:short类型是int类型的一个变体,通常占用2个字节的内存空间。int类型在C语言中经常使用,用来存储整数,其占用的内存空间通常是4个字节。 阅读详情

文章出处:http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103_2.html

 

C/C++的浮点数据类型有float和double两种。
类型float大小为4字节,即32位,内存中的存储方式如下:


 符号位(1 bit)

指数(8 bit)

尾数(23 bit)


类型double大小为8字节,即64位,内存布局如下:


符号位(1 bit)

指数(11 bit)

尾数(52 bit)


 
符号位决定浮点数的正负,0正1负。
指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1),由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制0111 1111),double类型指数的起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):


符号位

指数

尾数

0

1000 0000

010 0000 0000 0000 0000 0000

0

100 0000 0000

0100 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000
< p>


浮点数2.5可以用二进制小数准确表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小数不可以准确表示,其二进制形式的小数部分会无限循环,如浮点数-1.2表示如下(二进制):


符号位

指数

尾数

1

0111 1111

0011 0011 0011 0011 0011 010

1

011 1111 1111

0011 0011 0011 0011 0011 0011 0011
0011 0011 0011 0011 0011 0011


由于对无限循环尾数的截取遵循0舍1入,尾数的第21~24位为0011,第53~56位为0011,而float尾数容量为23位,double尾数容量为52位,所以,float形式的最后三位因进位而成010,double形式则没有进位发生。
 
类型float和double通过==,>,<等比较不会引起编译错误,但是非常可能得到错误的结果。这是因为它们的内存分布不同,不可以直接比较。正确的方法是转换为同一类型后比较两者差值,如果结果小于规定的小值,则视为相等。
如,一个比较double的实现:
http://metasharp.net/index.php?title=How_to_compare_double_or_float_in_Cpp
另外,本文参考了如下webs:
http://cdatatype.blogspot.com/2008/01/memory-map-of-floatdouble.html
http://blog.youkuaiyun.com/hzb1983/archive/2007/09/24/1798555.aspx
 
P.S.
1)
IEEE浮点数标准:     4字节浮点数:1位符号位,8位阶数(基数为127的移码),23位尾数;     8字节浮点数:1位符号位,11位阶数(基数为1023的移码),52位尾数
2 )
在VC中: float数值范围约在 -10e38~10e38,并提供7位有效数字位,绝对值小于10e38地数被处理成零值 double数值范围约在-10e308~10e308,并提供15~16位有效数字,绝对值小于10e308地数被处理成零值
OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源) 本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。 阅读详情

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

Java中的double类型数据存储探析

Java中的double类型数据存储探析

qq_23412557的博客 1272

【Linux内核】Linux内核裁剪完全指南:从理论到实战的系统优化

在嵌入式设备、专用服务器和物联网系统日益普及的今天,如何让Linux系统在资源受限的环境中高效运行成为开发者必须面对的问题。Linux内核裁剪正是解决这一问题的关键技术,它通过移除不必要的内核组件,打造出更精简、更安全、更高效的自定义操作系统。本文将系统全面地介绍Linux内核裁剪的完整流程和实用技巧,帮助您掌握这一核心技能。Linux内核裁剪是一项结合技术知识与实践经验的系统工程。明确需求:裁剪前必须清晰了解目标系统的硬件配置和功能需求。循序渐进:采取小步修改、反复测试的策略,避免一次性大幅修改。

撬动未来的支点的专栏 1388

float数在内存中的分布,以及以其他进制表示的最终值

float数在32位系统下,占用四字节32位。表示的目标是,将一个数映射到负无穷到正无穷上的某个点。所以,针对于float数,人为的将其划分为三部分: 1字节的符号位 + 8字节的指数位 + 23字节的尾数位 为什么要这么划分呢?我也不知道,不过猜测是挑选的一种较好的、约定俗成的划分方式。 这里,就有两个疑问?①一个小数怎么转换成最终的二进制表达。②比较浮点数一般使用a与b的绝对值与0.000001比较,为什么是六位? ...

zhanglu_1024的博客 1043

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1449

汽车标定技术(七)--英飞凌TC3xx_Overlay实现页切换

今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。

认真搞搞汽车MCU 4015

float的精度和取值范围

前言 关于float的精度和取值范围这个问题,我查询了很多次,每次都是用完就忘了,等到再使用的时候还需要再次查询,关键是这个问题大家给出的结果并不都是一致的,我得从众多的资料当中选择出正确的观点,这还要额外花一些时间,所以我决定也总结一次,方便我以后拿来直接用了,如果能给大家带来帮助那就更好了。下面提到一些说法很多都是我个人的理解,如果大家有疑义,欢迎讨论。 精度限制 首先考虑下为什么会产生精度...

AlbertS Home of Technology 23万+

深度解析:LPDDR5 采样 Mask 背后的秘密 —— 从 Jitter 到 BER 全面剖析

在 LPDDR5 中,CK/DQS 信号相当于“指挥棒”,而数据(DQ)要在时钟节拍里被准确采样。Crosspoint Mask 区域横轴:时间 (Time)纵轴:电压 (Vref)👉 只要采样点落在这个区域内,数据就是正确的。否则就会出错。BERPBERPMask 就像高速公路的收费站口,如果车(采样点🚗)在车道内,顺利通过;一旦跑偏,就撞护栏。LPDDR5 的速率极高,UI 非常短,Mask 区域成为核心指标各种 Jitter、Noise 会不断压缩 Mask。

weixin_43199439的博客 354

操作系统内存中指针类型都占用多少内存空间

经过查阅资料和实验得出结论 因为内存是由字节组成的,每个字节都有一个地址编号。指针变量主要是存放相同数据类型的变量的首地址,这里的地址就是指内存中某个字节的编号,而这个编号的确定是由地址总线决定的,操作系统的位数决定了指针变量所占的字节数。如果是32位操作系统,也就是地址总线是32位,则它的寻址范围就是02^32(04GB),所以每一个字节的编址就会由32个0或者1组成。 例:第1个字节的编址是32个0,最后1个的编址是32个1。一个字节有8位,32位则需要4个字节。 在不同操作系统中指针大小结论 (1)在

qq_45382565的博客 8029

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1733

RT-Thread精通PM功耗调优 - Tickless篇

背景 让别人的思想装到自己的脑袋里,这不仅需要威逼利诱,还需要讲清楚原理。喜欢才能接受。 功耗基本的调试手段,估计前面讲了很多,或许只有少数人群可以接受。 更有极少的人,了解了整个功耗管理的体系、原理,愿意接受这样的【安排】。 这里的功耗调优思路,其实只是解决功耗问题的一种思路,并不是框架。 解决问题,自古以来,都是千奇百怪,秒在【奇】。 介绍 本篇介绍下Tickless的工作原理。 Tickless 可以理解为:tick-less,tick or little tick。 tick定.

坚韧与专注 1529

float和double类型的内存分布和比较方法收藏

 文章出处:http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103_2.html C/C++的浮点数据类型有float和double两种。 类型float大小为4字节,即32位,内存中的存储方式如下:  符号位(1 bit) 指数(8 bit) 尾数(23 bit) 类

远超的blog 4732

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

[C/C++] float和double类型的内存分布和比较方法

  C/C++的浮点数据类型有float和double两种。类型float大小为4字节,即32位,内存中的存储方式如下:  符号位(1 bit) 指数(8 bit)

vinsendai的专栏 3888

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【转】float和double类型的内存分布和比较方法收藏

文章出处:http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103_2.htmlC/C++的浮点数据类型有float和double两种。 类型float大小为4字节,即32位,内存中的存储方式如下:  符号位(1 bit) 指数(8 bit) 尾数(23 bit)

code09的专栏 662

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

float double的内存表示及比较大小的方法

float和double类型的内存分布和比较方法收藏 Comparing floating point numbers   总结几点: 0. float占4byte,精度是6~7位;double占8byte,精度是15~16位。  1. C/C++的浮点数据类型有float和double两种。它们在内存中是以科学计数法的结果来存储的。  类型float大小

Thinking 1174

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

float与double类型的内存分布,精度和范围

float与double类型的内存分布,精度和范围  内存分布: C/c++的浮点数据类型有float和double两种。 float大小为4字节,内存中的存储方式如下:符号位(1bit)指数(8bit)尾数(23bit) double大小为8字节,内存中的存储方式如下:符号位(1bit)指数(11bit)尾数(52bit) 符号位决定浮点数的正负,0正1负。指数和

郭海朋的专栏 8598

Java 浮点数 float和double类型的表示范围和精度

隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数。有事后会产生让人觉得莫名其妙的事情。

张小琦的博客专栏 8万+
上一篇: VC中如何编译无Console窗口的Console程序
下一篇: 关于Perl里面正则规范
fibbery
博客等级 码龄25年 304粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值