【转】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


浮点数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地数被处理成零值

qt5.14.2+vs2019配置msvc2017编译器 qt5.14.2+vs2019配置msvc2017编译器 在使用qt编译程序时此前一直使用的是自带的MinGW 32-bit和64-bit,现在想使用msvc编译器。本次使用的是qt5.14.2,vs2019,需要配置msvc2017的32-bit和64-bit编译器。 1、首先安装好qt5.14.2和vs2019,其次在visual studio installer选择修改,然后选择msvc2017对应的组件,本次安装的是这两个 2、打开qt creator的工具–选项–kits–编译器,选择Manu 阅读详情

相关推荐

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

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) 类型double大小为8字节

fibbery学习笔记 1632

树莓派3-改装wifi外置天线

声明:本文只是技术性探讨,改装引起的产品损坏等后果,由用户自负! 改装主要有两种方法 方法一:直接替换原来的天线 1、移除原有的小陶瓷天线,就在Made in PRC(或UK)那边的那个 清理一下阻焊剂方便天线接地(图中PRC左侧) 2、焊接天线 天线的屏蔽层焊接到清理完阻焊剂的地方,中间的信号线焊接到PRC右侧焊盘。 3、最终的样子

huayucong的博客 2万+

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

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

qq_23412557的博客 1272

IBM System x3650 M5 IMM配置

1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服...

血饮渊虹的博客 4万+

从毫米波到计算机视觉:智能座舱监控系统的多模态技术融合

本文探讨了智能座舱监控系统中多模态技术融合的创新应用,涵盖毫米波雷达、红外传感与计算机视觉的协同架构。通过传感器时空对齐、低光照算法突破及隐私保护设计,系统在DMS、OMS等场景实现99.7%的检测准确率,同时优化成本至$45以内,为汽车智能化提供关键技术支撑。

d6e7f8的博客 902

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

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

zhanglu_1024的博客 1043

将pytorch的权值矩阵量化为定点数补码并导入FPGA中

Xilinx FPGA实现LSTM算法时对ROM的初始化 将pytorch框架的权重矩阵以定点数补码的形式导入到FPGA中 文章目录Xilinx FPGA实现LSTM算法时对ROM的初始化1. pytorch框架中的LSTM2. 初始化一个RNN模型 3. 初始化ROM的coe文件格式 4. 将参数转换为补码,并且输出到coe文件 5. 配置一个ROM 6. 结论7. 代码 1. pytorch框架中的LSTM pytorch框架将LSTM算法中的八个权值矩阵连接成两个矩阵,假设要导入的LSTM网络的输

随缘分享 4527

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

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

qq_45382565的博客 8029

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3382

suse ha for sap scale-up性能优化场景安装配置

suse ha for SAP安装配置

jetliu05的博客 2134

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

vinsendai的专栏 3888

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

郭海朋的专栏 8598

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

张小琦的博客专栏 8万+

float和double类型的内存分布

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

diche7031的博客 306

int float double 最大值,最小值及内存分布

拿32bit X86机器测试: /* coder: ACboy date: 2010-3-1 */ #include #include using namespace std; int main() { cout << "in

Sunny04的专栏 2万+

java float和double类型的表示范围和精度

转载自张小琦的博客[https://blog.youkuaiyun.com/zq602316498/article/details/41148063] 隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数。有时候会产生让人觉得莫名其妙的事情。 如在java中, 0.99999999f==1f //true 0.9f==1f //false 要明白这些,首先要搞清楚float和do...

tinysakura的博客 5157

float double 比较大小问题

一、 类型float和double通过==,>, #define   eps  XXX const double eps = XXX; XXX 一般取  1e-6. 这两种都可以。 然后 用  fabs(a - b) 二、 1. 范围   float和double的范围是由指数的位数来决定的。   float的指数位有8位,而doub

lavendermaple的专栏 1779
上一篇: C/C++试题(笔记)
下一篇: 【转】在VC6中使用 GdiPlus
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值