`
wenzongliang
  • 浏览: 448734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

浮点数在内存中的存储格式

 
阅读更多
  • C/C++ 程序中的浮点数

计算机程序中的浮点数的表示方式也类似上面提到的方式.只是在计算机中是以 2 为底数,而不是 10.

需要注意
  1. Intel CPU 是采用 little-endian ( The most significant byte is on the right end of a word. ) 所以在观察内存时是需要反过来读的.
  2. 有一些编译器 和 平台支持精度更高的 Double-Extended
  • C/C++ 编译器中的浮点数表示方式如下表所示.
   符号位 ( Sign )  指数 ( Exponent )  尾数 ( Mantissa )
 单精度浮点数 ( float )  1 [31]  8 [30-23]  23 [22-00]
 双精度浮点数 ( double)  1 [63]  11 [62-52]  52 [51-00]
  •  
    •  
      • 符号
符号位占用一位.在最高位. 0 表示正数. 1 表示负数.
  •  
    •  
      • 指数
以 float 为例 指数位 占用 8 为, 他的表示范围是. -127 ~ +128. 但是 -127 和 +128 这 2 个数字是保留用作表示特殊状态的. ( -127 用来表示 这个是 0, 即 Zero 状态. +128 一般用来表示NaN 状态. NaN 是指 Not a Number. 不是一个实际的数字. )
 
这 8 位在做计算是要注意范围是从 -127 ~ +128 的,所以在计算是要减去 127.
比如有这 8位的指数2进制如下:
10000000
 
所以这个指数表示的是: 10000000b = 128 考虑到范围所以 128 - 127 = 1
 
当精度为 double 时也是这样的,只是表示范围是 -1023 ~ +1024 .
 
  •  
    •  
      • 尾数
尾数又叫有效位数 ( Significand ), 他和 科学记数中的尾数一样是用来表示这个数字的大小 和 精确度的.
尾数的格式是 1.F. 其中 F 是对应的 小数位. 整数部分的 1 是在计算中省略的.
 
  • 举实际例子来说
比如: 
有十进制 +5.5, 则有
+5.5 = 1.375 × 22

随后把 尾数换算成 2 进制.
1.375 = 1 .011 B  ( 即,  1 × 21 + 1 × 2-2 + 1 × 2-3 )

由于 float 中尾数占用 23 位,所以要不齐那些无用的 0, 就得出 尾数为.
1 .01100000000000000000000 

指数位是 2,由于 float 变换范围是 -127 ~ +128 占用 8 位. 所以指数位应该等于 2 + 127 = 10000001b

所以就有 2 进制表示.
 符号位 ( Sign )  指数 ( Exponent )  尾数 ( Mantissa )
 0 10000001 01100000000000000000000

 

得出 +5.5 = 01000000101100000000000000000000B = 0x40B00000
因为 little-endian 的关系,所以在内存中观察是反序的,即 [ 00 00 B0 40 ]
  • 开发时的注意事项

    • 比较操作
不可将浮点变量用 “==” 或 “!=” 与任何数字比较.千万要留意,无论是float 还是double 类型的变量,都有精度限制.
所以一定要避免将浮点变量用 “==” 或 “!=” 与数字比较,应该设法转化成 “>=” 或 “<=” 形式.
 
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-PRECISION) && (x<=PRECISION))
其中PRECISION 是允许的误差(即精度).如果不是和 0 比较,则可用 与比较值之间的差值的绝对值与精度比较.比如: x 与 y 的比较可写成 fabs( x - y ) < PRECISION

  •  
    • 位运算
正常情况下不要用 浮点数去做位运算.即使是你清楚浮点的存储结构.
理由有二. 1. 不便于他人维护代码. 2. 可能有编译器不兼容问题.
分享到:
评论

相关推荐

    浮点数在内存中的存储格式.rar

    浮点数在内存中的存储格式浮点数在内存中的存储格式

    浮点数在计算机内存中的存储格式

    浮点数在计算机内存中的存储格式

    浮点数在计算机内存中的存储格式.zip

    浮点数在计算机内存中的存储格式.zip

    浮点数在计算机内存中的存储格式.pdf

    浮点数在计算机内存中的存储格式.pdf

    C/C++的浮点数在内存中的存储方式分析及实例

    C/C++的浮点数在内存中的存储方式分析 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) ...

    深入C/C++浮点数在内存中的存储方式详解

    但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。对于float型数据,其...

    [详细完整版]单片机浮点数.pdf

    浮点数在内存中的存储方式 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1 是负,0 是正 E 偏移 127 的幂,二进制阶码=(EEEEEEEE)-127。...

    单双精度浮点数解析.c

    对于计算机中常见的浮点数存储格式进行分析,编程提取float和double中的阶码好尾码。

    利用CopyMemory实现IEEE754与十进制float之间的转换

    对于vb vb.net c#或者 c来说,单精度浮点数在内存中占用4个字节,本身就是以IEEE754的标准格式来存储的。所以当我们需要用到的时候,其实并不需要自己去转换,直接以内存指针的方式,将内存中的数据以我们需要的方式...

    11076 浮点数的分数表达

    在计算机中,用float或double来存储小数有时不能得到精确值,若要精确表达一个浮点数的计算结果, 最好用分数来表示小数,有限小数或无限循环小数都可以转化为分数,无限循环小数的循环节用括号标记出来。如: 0.9 =...

    处理二进制及汉字内码的动态链接库

    BinFileEx.DLL是一个封装了用于生成保存各种...BinFileEx.DLL还封装了十进制/十六进制/二进制间的相互转换Win32 API函数,同时封装了整数或浮点数同内存中的储存格式间的相互转换。 此动态链接库的全部源代码对外开放。

    处理二进制及汉字内码的动态链接库vc++源码

    BinFileEx.DLL是一个封装...BinFileEx.DLL还封装了十进制/十六进制/二进制间的相互转换Win32 API函数,同时封装了整数或浮点数同内存中的储存格式间的相互转换。 这是此动态链接库的全部源代码,建议用VC6.0打开编绎。

    C语言难点分析整理

    1. C 语言中的指针和内存泄漏 5 ...12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89

    高级进阶c语言教程..doc

    12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符...

    EEPROMEx.rar

    启用写入限制:理论上可以在几分钟内烧坏内存单元: 写入/擦除周期大约需要 4毫秒,因此在单个单元格中写入 100.000次将占用 6分钟。 限制调试阶段写入的次数有助于防止。 内存范围的写入调试。

    buntdb:BuntDB是用于Go的可嵌入的内存中键值数据库,具有自定义索引和地理空间支持

    BuntDB是纯Go中的低级内存中键/值存储。 它持久保存到磁盘,符合ACID,并为多个读取器和一个写入器使用锁定。 它支持自定义索引和地理空间数据。 对于需要可靠数据库并且在速度上胜于数据量的项目,它是理想的选择。...

    免费下载:C语言难点分析整理.doc

    12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符...

    emWin5用户手册(中文)

    2.4 要包含在项目中的 C 文件..............................................................................35 2.5 emWin 的配置 ..............................................................................

    浮点型储存方式

    浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。一个浮点数由2部分组成:底数m 和指数e。 ±mantissa × 2exponent (注意,公式中的mantissa 和 exponent使用二进制表示)

Global site tag (gtag.js) - Google Analytics