没有合适的资源?快使用搜索试试~ 我知道了~
float与double讲解
需积分: 13 10 下载量 106 浏览量
2011-09-05
23:36:19
上传
评论
收藏 39KB DOC 举报
温馨提示
试读
4页
最近一段时间看到版上关于C++里浮点变量精度的讨论比较多,那么我就给对这个问题有疑惑的人详细的讲解一下intel的处理器上是如何处理浮点数的。
资源推荐
资源详情
资源评论
最近一段时间看到版上关于 C++里浮点变量精度的讨论比较多,那么我就给对这个问题有疑惑的人
详细的讲解一下 intel 的处理器上是如何处理浮点数的。为了能更方便的讲解,我在这里只以 float 型
为例,从存储结构和算法上来讲,double 和 float 是一样的,不一样的地方仅仅是 float 是 32 位的,
double 是 64 位的,所以 double 能存储更高的精度。还要说的一点是文章和程序一样,兼容性是有
一定范围的,所以你想要完全读懂本文,你最好对二进制、十进制、十六进制的转换有比较深入的
了解,了解数据在内存中的存储结构,并且会使用 VC.net 编译简单的控制台程序。OK,下面我们
开始。
大家都知道任何数据在内存中都是以二进制(1 或着 0)顺序存储的,每一个 1 或着 0 被称为 1 位,
而在 x86CPU 上一个字节是 8 位。比如一个 16 位(2 字节)的 short int 型变量的值是 1156,那么
它的二进制表达就是:00000100 10000100。由于 Intel CPU 的架构是 Little Endian(请参数机
算机原理相关知识),所以它是按字节倒序存储的,那么就因该是这样:10000100 00000100,
这就是定点数 1156 在内存中的结构。
那么浮点数是如何存储的呢?目前已知的所有的 C/C++编译器都是按照 IEEE(国际电子电器工程师
协会)制定的 IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、
指数和尾数来表示,底数被确定为 2,也就是说是把一个浮点数表示为尾数乘以 2 的指数次方再加上
符号。下面来看一下具体的 float 的规格:
float
共计 32 位,折合 4 字节
由最高到最低位分别是第 31、30、29、……、0 位
31 位是符号位,1 表示该数为负,0 反之。
30-23 位,一共 8 位是指数位。
22-0 位,一共 23 位是尾数位。
每 8 位分为一组,分成 4 组,分别是 A 组、B 组、C 组、D 组。
每一组是一个字节,在内存中逆序存储,即:DCBA
我们先不考虑逆序存储的问题,因为那样会把读者彻底搞晕,所以我先按照顺序的来讲,最后再把
他们翻过来就行了。
现在让我们按照 IEEE 浮点数表示法,一步步的将 float 型浮点数 12345.0f 转换为十六进制代码。在
处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000 也可以
这样表示:11110001001000000.0 然后将小数点向左移,一直移到离最高位只有 1 位,就是最高位
的 1:1.11100010010000000 一共移动了 16 位,在布耳运算中小数点每向左移一位就等于在以 2 为
底的科学计算法表示中指数+1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好
了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是 1,因为你不可能把买了 16 个鸡
蛋说成是买了 0016 个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我~),所以这个 1 我们还有必要保
留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了:11100010010000000 最
后在尾数的后面补 0,一直到补够 23 位:11100010010000000000000(MD,这些个 0 差点没把我
数的背过气去~)
资源评论
印36
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功