float型数据在内存中是怎么表示的?

那个人的 2011-09-03 11:14:23
计算机组成原理上说float型数据是用“阶移尾补”的方式表示的,但是我用vc6随便做了一个数据,然后用Memory查看,什么乱起八糟的东西啊,根本不是阶移尾补,比如说吧。

我让float a = 1.000000 这个时候看a的存储空间是:

3F 80 00 00
也就是 0011 1111 1000 0000 0000 0000 0000 0000
这怎么能是1.000000的值呢?

再比如说,我让float a = 4.000000 这个时候看a的存储空间是:
40 80 00 00
也就是 0010 0000 1000 0000 0000 0000 0000 0000
这又怎么能是4呢?

在比如说,我让float a = 1.100000 这个时候看a的存储空间是:
3F 8C CC CD
迷茫了……
...全文
1710 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ryan_332595319 的回复:]
额。。。怎么没有排列整齐?刚刚编辑在时候明明是对齐在。。。
2、float i = 4.000000
正数 第一符号位是 0
向后偏移2位 就是1000 0001 因为 129 - 127 =2
小数点后面 0000 0000 0000 0000 0000 000
整理就是
0100 0000 1000 0000 0000 0000 0000 0000
4 0 8 0 0 0 0 0……
[/Quote]
// 1、float i = 1.000000;
// 符号位(1位) 移位(8位) 小数点后面(23位)
// 0 0111 1111 0000 0000 0000 0000 0000 000
// 正数用0表示 移位0 = 0111 1111 - 127 .000000
// 合并整理
// 0011 1111 1000 0000 0000 0000 0000 0000 二进制
// 3 F 8 0 0 0 0 0 十六进制
//
// 2、float i = 4.000000
// 正数 第一符号位是 0
// 向后偏移2位 就是1000 0001 因为 129 - 127 =2
// 小数点后面 0000 0000 0000 0000 0000 000
// 整理就是
// 0100 0000 1000 0000 0000 0000 0000 0000
// 4 0 8 0 0 0 0 0
序员 2011-09-07
  • 打赏
  • 举报
回复
楼主你是怎么查看内存空间的?
辰岡墨竹 2011-09-04
  • 打赏
  • 举报
回复
都是标准的,C/C++用的是标准的IEEE754浮点模型。
jackyjkchen 2011-09-03
  • 打赏
  • 举报
回复
请楼主搜索“浮点模型”
leer168 2011-09-03
  • 打赏
  • 举报
回复
Mark
_lee_chong 2011-09-03
  • 打赏
  • 举报
回复
算的我头好晕哦、、、、
limang89 2011-09-03
  • 打赏
  • 举报
回复
顶下。。。
仙度瑞城 2011-09-03
  • 打赏
  • 举报
回复
额。。。怎么没有排列整齐?刚刚编辑在时候明明是对齐在。。。
2、float i = 4.000000
正数 第一符号位是 0
向后偏移2位 就是1000 0001 因为 129 - 127 =2
小数点后面 0000 0000 0000 0000 0000 000
整理就是
0100 0000 1000 0000 0000 0000 0000 0000
4 0 8 0 0 0 0 0
仙度瑞城 2011-09-03
  • 打赏
  • 举报
回复
现在我跟说说那些数字具体是怎么转换过来在
1、float i = 1.000000;
符号位(1位) 移位(8位) 小数点后面(23位)
0 0111 1111 0000 0000 0000 0000 0000 000
正数用0表示 移位0 = 0111 1111 - 127 .000000
合并整理
0011 1111 1000 0000 0000 0000 0000 0000 二进制
3 F 8 0 0 0 0 0 十六进制
仙度瑞城 2011-09-03
  • 打赏
  • 举报
回复
浮点数保存的字节格式如下:

地址 +0 +1 +2 +3
内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

这里
S 代表符号位,1是负,0是正
E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。
M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了
较高的有效位数,提高了精度。

零是一个特定值,幂是0 尾数也是0。

浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:
地址 +0 +1 +2 +3
内容0xC1 0x48 0x00 0x00

浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转
换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表
所列的那样分开,例如:

地址 +0 +1 +2 +3
格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
二进制 11000001 01001000 00000000 00000000
十六进制 C1 48 00 00

从这个例子可以得到下面的信息:
符号位是1 表示一个负数
幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。
尾数是后面的二进制数10010000000000000000000


在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数
点到尾数的开头,得到尾数值如下:
1.10010000000000000000000

接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为
指数是3,尾数调整如下:
1100.10000000000000000000

结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示
(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(1*2^(-1))+
(0*2^(-2))+(0*2^(-2))...=0.5。
这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-
12.5。
Trinx 2011-09-03
  • 打赏
  • 举报
回复
现在好多系统在实现浮点数时确实比整型复杂多了,一般由符号位、指数位和小数位组成,具体怎么组成楼主在网上搜搜吧。
 OpenGL-自主高性能三维GIS平台架构与实现/第二季:实现三维GIS球体+ 高程数据章节名称DEM基础1DEM基础知识1.介绍基本的DEM知识2.什么是DEM,作用是什么2DEM数据1.如何获取/ 传统测量/激光扫描/无人机测量/ 点云数据/ 倾斜摄影2.如何使用/局部小规模(栅格数据,图片/tif),3. 组织方式4. 根据使用目的不同,介绍多种优化方法3DEM图层的实现原理14DEM数据结构定义struct  V3U3N4顶点数据的生成和计算WGS84投影计算5wgs84 投影球体被切成一个个小圆弧,一共60个投影带,分别为01,02.........60WGS的最新版本为WGS 84(也称作WGS 1984、EPSG:4326),1984年定义、最后修订于2004年。接口定义坐标转换Wgs84 数据加载6瓦片编号计算生成算法1. 经纬度到大地坐标的转换2.大地坐标到经纬度坐标转换3. 根据经纬度获取瓦片编号框架重构7智能指针重构框架1. 基类定义(所有的类继承自基类),基类派生自 std::enbale_shared_from_this2. 实现智能指针的动态转换接口3. 实现向下转换4. 已有的类实现全部使用智能指针重构5. 任务系统(多线程加载任务)8引入图层(Layer)1. 介绍图层的概念以及重要性2. 图层类实现3. 修改框架(使用图层的方式重构框架)9Layer-bug排查(绘制过程中出现错位,偶发)1. 框架重构后遇到问题(绘制结果错误)2. 瓦片索引方式发生变化,多线程中引起内存问题3. 修改索引方式,解决绘制偶发错误问题10引入数据源(TileSource)1. 数据源的作用与设计目的2. 当前存在的问题,数据调度中存在问题3. 数据源(TileSource)类实现11数据格式管理(FormatMgr)1. 数据格式管理(FormatMgr) 提出的目的,需要解决的问题2. CELLFormat基类接口抽象3. 实现几个标准格式类4. 修改框架流程,使用FormatMgr重构流程5. 扩展支持,后续支持任务格式数据加入系统12Task(任务)优化1. 任务中低耦合数据结构,目的是让Task更加的通用2. 修改任务读取代码与任务处理代码,完善处理流程DEM高程13DEM-数字高程定义1. 什么是数字化高程数据2. 当下GIS系统中有哪些常见的高程格式3. 课程体体系中使用的哪种格式4. 高程类定义以及实现,并加入到FormatMgr 管理系统中14高程瓦片数据读取1. 介绍GIS系统相关的工具(在数据转换)数据生成方面可以解决大量时间2. 自定义高程瓦片格式说明3. 自定义高程格式文件解析,并以智能对象的方式引入到系统中4. 完善框架代码,适配高程数据15高程瓦片文件的读取1. 实现基本的读取算法2. 增加格式化组件,并加入到系统中3. 配置高程图层以及高程数据源,并加载数据,验证数据正确性16瓦片数据结构重构1.顶点生成2.UV坐标计算3.面数据生成17DEM重构绘制流程1. 修改绘制数据结构,去除无用字段2. 增加Mesh类,实现光栅数据转换成三角面数据,计算UV数据,提炼接口3. 修改系统调度,实现顶点数据,UV数据,以及面数据的生成与更新4. 按需更新数据,而不是每一帧更新18DEM-数据精度问题(CPU)1. 因为瓦片数据使用大地坐标作为系统输入,造成瓦片坐标很大,单浮点数据精度不够2. 使用局部坐标的方式解决单浮点精度问题3. 调整相机参数,解决投影矩阵数据计算深度精度问题4. 修改绘制shader 实现对瓦片数据的绘制19DEM-数据精度问题(LogDepth)1. 使用对数深度(log depth )算法在GPU中 计算解决单浮点经纬计算问题2. 修改shader ,增加对(logDepth)算法支持3. 修改C++端代码,实现对shader数据的输入20DEM-数据结构优化1.当下使用CPU端数据通过接口的方式传递给GPU,速度慢2. 使用Instance 方式降低Vertex Buffer 的大小,优化渲染系统21DEM-GPU缓冲区优化1. 使用Vertex Buffer Object / Index Buffer Object  / Instance  方式优化渲染系统2. 修改绘制接口,使用DrawElementsInstanceBaseInstance方式提升系统性能内存池与对象池22瓦片生成优化/对象池1. 相机移动过程中会频繁的建立与释放瓦片,对CPU有较大的消耗2. 引入内存池,避免频繁的内存申请与释放,降低CPU时间3. 改造智能指针对象,对象释放通知到内存管理,回收对象内存23改造任务系统支持对象池1. 任务系统是一个公用模块,被多个模块使用,避免频繁的内存操作,引起的内存碎片2. 实现对象池,并应用到任务模块法线计算24法线计算1. 修改现有顶点结构,增加法线支持2. 修改shader,增加法线顶点输入,使用平行光光照模3. 修改绘制流程,支持光照计算,使用探照灯作为光源输入25顶点法线计算/共享法线计算1. 增加数据结构保存顶点数据被多个面共享的次数2. 计算面法线,并累加到顶点法线中3. 根据顶点被面共享的次数做平均法线计算4. 修改流程,按需更新法线数据26法线数据压缩1. 法线数据使用3 * float 数据存储,大大的增加了系统的数据2. 实现算法,将3 * float 数据压缩成4字节数据3. 改造绘制代码,支持压缩数据输入27GPU中计算产生法线数据(去掉CPU中计算)1. 引擎支持 Geometry Shader 阶段2. 编写 Geometry Shader,实现法线计算系统功能优化28重构CPU拾取流程1. 当下的拾取流程,只支撑二维数据拾取,无法准群的拾取三维数据2. Terrain中增加拾取接口,输入射线,输出拾取到顶点数据29绘制拾取结果1. 增加一个绘制点的方法,实现绘制代码2. 修改shader,增加logdepth3. 调试代码,花费了很多时间排查错误,最总排查到是因为uniform参数笔误写错造成。30任务系统完善,避免任务队列无线膨胀1. 任务系统中,没有限制队列的大小,生产者的能力远大于消费者的能力,造成任务队列膨胀2. 处理办法,限制生产者的生产能力,而不是限制任务队列大小(这种方式会造成业务逻辑异常复杂)3. 使用sleep休眠方式(这种方式是严重错误的)31如何避免瓦片数据抖动1. 产生瓦片抖动的原因 ? 分裂算法与回退算法中间没有过度2. 引入过度流程,避免内存抖动,参数因子是一个重要的数据,需要谨慎使用3. 有必要结合瓦片自身数据动态计算参数因子32瓦片数据管理-fepk文件格式支持-全球数据加载1. 支持fepk文件格式,增加fepk读取组件,适配fepk文件2. fepk管理数据方式:一般情况选择全球前10级别作为基础级别,因数据量不大(1G)左右,后续以8级作为基础级别,全球19级别数据被划分为 2^8 * 2^7(512 * 256)个块。每个块中包含了256 * 256 张小瓦片33fepk高程数据读取 34高程分裂处理当瓦片没有高程数据,那么子节点以及其他后代节点该如何共享父节点的数据35lesson-734-高程瓦片分裂处理(2)-算法实现高程数据分裂算法实现实现对高程数据的切分,并对特殊数据进行处理36高程瓦片分裂处理(3)-问题排查 37高程瓦片分裂处理(4)-(后代节点更新问题)当一个瓦片高程数据更新后,他的儿子节点,孙子节点...该如何处理?38瓦片视锥裁剪错误高程数据更新后,没有技术计算瓦片包围盒信息,造成包围盒错误,进而引视锥计算错误39http支持1.引入三方库 Libcurl2.http类封装,支持http读取数据40fepk.server使用 生成三维地球41改造四叉树-统一使用经纬度输入42地形网络生成算法重构 43引入球体坐标系 44使用球体坐标改造瓦片 45多图层(加载标签数据) 课时截图:镜头拉近后,显示细节数据加载矢量SHP国界线数据:加载矢量三维白膜数据截图高程数据加载点云数据 加载倾斜摄影数据 
1 / 3(一) 大纲_Python 基础(3 天×6h) 课时:18 小时(6 小时×3 天)课程简介 本课程从零基础开始介绍 Python 编程知识,快速入门 Python 语言基础,循序渐进地掌握 Python 模块的构建和 Python 程序的代码的基本功能的实现。学员基础  了解计算机基本操作,掌握一般文字输入和处理的基础知识 了解计算机软件,硬件等基本概念课程目标  全面认识 Python,包括语言特点、应用领域、安装与执行原理、集成开发环境的使用等 掌握 Python 的基础语法,实现简单的程序编写 熟练使用 Python 的各种数据结构,掌握各自的适用场景 熟练使用模块和包,理解使用模块的好处,在工作中灵活借助模块实现需求课程内容 Python 概述及开发环境搭建 1.1 Python 应用领域 1.2 常见编程语言特点  Python 语言特点 面向对象与面向过程 编译与解释1.3 Python IDE 集成开发环境  PyCharm 安装及配置 Python 编程语言基础 2.1 库、包、模块 2.2 变量的定义及命名规范 2.3 书写规范 2.4 命名规范 2.5 运算符  算数运算符、逻辑运算符、赋值运算符、比较运算符、成员运算符、身份运算符2 / 3 运算符优先级 流程控制 3.1 流程控制语句结构 3.2 分支结构 if else 的语法结构及应用场景  多条件判断3.3 循环语句  for 语句 while 语句 嵌套循环 循环控制语句 跳出循环 常用数据及其函数 4.1 字符串 str 4.2 整数 int、浮点小数 float 4.3 布尔 bool 4.4 列表 list  数值列表 range 数值列表转列表:list 函数 遍历列表 列表解析4.5 元组 tuple 4.6 字典 dict 4.7 集合 set 4.8 切片 4.9 在列表中存储字典 4.10 在字典中存储列表、字典 4.11 高级数据的运算 4.12 案例演练  练习:登录验证3 / 3 练习:遍历元组 练习:遍历集合 练习:while 循环列表 函数 5.1 函数的定义和作用  定义函数规范 调用函数5.2 函数的参数和返回值 5.3 局部变量与全部变量 5.4 位置参数与关键字参数 5.5 缺省参数与多值参数 5.6 数据的不可变类与可变类 5.7 常用内置函数  输出输入函数:print、input dir 函数 包与模块 6.1 了解库、包、模块 6.2 模块的导入方式  导入整个模块(.py) 导入模块中的函数 自定义模块的导入与应用6.3 定义别名 6.4 了解与制作包  导入包的方式6.5 常用标准库  time:日期时间计算 os:文件和目录处理

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧