浮点数在计算机中的表示

最后编辑于:2010-4-13

计算机中数字是以0和1二进制保存的,我们熟悉的是整数的如何在计算机中表示,那么浮点数是如何表示的呢?

一.    转换

我们先来看看如何将十进制的浮点数转换成二进制。

一个十进制的浮点数,例如:abcd.efg  (其中a~g为0..9),其值用多项式为:

a*10^3 + b*10^2 + c*10^1+d*10^0+e*10^(-1)+f*10^(-1)+g*10^(-3)。

而一个二进制的浮点数,我们也将其表示成:abcd.efg  (其中a~g为0或1),其值表示为:

a*2^3 + b*2^2 + c*2^1+d*2^0+e*2^(-1)+f*2^(-1)+g*2^(-3)。

我们看到底由十进制时的10换成了二进制时的2了,其它都一样。所以一个十进制的浮点数转换成二进制必须分两步进行:整数部分和小数部分。

1.    对于整数部分,和以前的整数转换是一样的。

2.    对于小数部分,比较特殊。下面讲两种转换方法。

方法一:依次与2^(-n)作比较(n从1开始),若大于该值则为1,且减去此值,否则为0;然后继续下一轮比较。举例说明:将0.842356转换成二进制:

此时,你会发现比较将会是无穷无尽的。如果你截取到某位,必须做一些取舍。取舍的标准是:其后一位若为1则进1;后一位为0则不进。

还是以上面为例,若要截取9位,因为第10位为0,故不进位,则最终的结果为:0.110101111

;若要截取到8位,因为第9位为1,故要进位,则最终的结果为:0.110110000

(即0.1101101111 + 0.0000000001)。从这个例子可以看出十进制小数的转换成二进制时只是一个近似值。其实大部分浮点数保存在计算机中都只是一个近似值。至于是稍微大于原值还是稍微小于原值,要看截取时有无进位。

方法二:若在计算机中计算方法一的过程,因为2^(-n)本身就是一个浮点数,而浮点数之间的比较和计算难免有误差。所以我想到了下面这个方法:

1)    首先生成首数字为1、后面0的个数为小数位数的基准数,比如0.254的基准数为1000、0.00353的基准数为100000。

2)    将小数部分乘以上面的基准数,这样得到一个整数。

3)    对该整数乘以2,若积大于基准数,则为1,同时将积减去基准数后得新的整数;若积小于基准数,则为0。

4)    用新的整数重复步骤3,直到整数为0或者到需要的精确位数,作取舍后结束。

举例说明:将0.842356转换成二进制,基准数为1000000,转换成整数为842356,

此法可以有效地避免浮点数的比较,能方便且快捷地获得对应的二进制值。

二.    存储

现在已转换成浮点二进制了,那么如何在计算机中表示呢?这要说到科学计数法,这个大家比较熟悉。十进制的科学计算法可以表示成如下:(-1)^s * M * 10^E

,S表示符号:S为1表示负数;0为正数。M成为尾数,其范围为1<=M <10 。E被成为幂,也叫指数。

二进制的科学计数法,也是IEEE的浮点数标准格式,和十进制格式一样:(-1)^s * M * 2^E

。M的范围1<= M <2。将一个二进制浮点数转换成科学计算法很简单,例如:

1)10001.110001 小数点左移4位后成 (-1)^0 * (1.0001110001) * 2 ^ 4.

2) -0.000010001 小数点右移4位后成(-1)^1 * (1.0001) * 2 ^ ( – 4)

在计算机中,表示浮点数由两种常用的格式:单精度浮点数和双精度浮点数,它们在精度上有所差别,同时所需要的空间也有差别:

1)    当为负数时,符号位为1,否则为0。

2)    指数有正数亦有负数,这里保存时使用了加偏移量的方法:8位指数位的指数范围为-127~128,其偏移量为127;11位指数范围为-1023~1024,其偏移量为1023。保存时指数加上偏移量,可以避免负数问题;取值时再减去偏移量就行了。

3)    因为尾数1<=M<2,就是说小数点前面总是有一个1。为了节省空间,将此处的1省去,直接将小数点后面的部分放入到小数部分(这也是这部分为什么叫“小数部分”,而不是“尾数部分”的原因)。

举一例:将12.842356保存成单精度浮点格式。

1)    首先将它转换成二进制格式:1100.11010111101001001010,后面位直接截去。

2)    转换成科学计数法格式:1. 10011010111101001001010。右移3位于是指数为3+127=130,二进制为10000010。

3)    于是符号位为0,指数为:10000010,小数去掉前面的1后为10011010111101001001010。这些二进制就是最终保存在电脑里的格式:0 10000010 10011010111101001001010,十六进制格式为:0x414D7A4A。

三.    SQL SERVER中的浮点数

SQL SERVER浮点数有float和real两种。Float类型定义格式:float [ ( n ) ]。 n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

精度与存储字节之间的关系:

在 SQL Server 中,real 的同义词为 float(24)。

比起其他的精确数值类型,浮点数的优点是保存的数值大。比如单精度由于其指数为8位,故其最大值约为1.1 * 2^128 = 3.4 * 10^38;双精度其指数为11位,故其最大值约为1.1 * 2^1024 = 1.79 * 10^308。

当然,浮点数的最大缺点就是数据的近似值保存。就是这个原因,导致了下面的一个小小的问题。

四.    SQL SERVER中浮点数的一个问题

因为float和real格式只能保存近似值,除非要保存特别大的数值,否则推荐使用精确数值类型。下面说说在SQL SERVER中遇到的一个浮点问题,其实这也是为什么写这篇文章的原因。最近有人问下面这个问题:

Declare @a, @b float

Set @a = 1.465

Set @b = 2.465

Select round(@a, 2), round(@b, 2)

结果分别为1.47和2.46,这是为什么?

上文中我们说过,大部分浮点数保存在计算机中都只是一个近似值。小数部分转化成二进制时,会根据情况截去或进位。

1.465保存到计算机中时,小数的最后一位需要进位(结果为0x3FF770A3D70A3D71),这就造成了保存的值比实际的1.465稍微大一点。0x3FF770A3D70A3D71转换成十进制后值约为1.4650000000000001。

而2.465却正好相反,它在保存到计算机中时,小数的最后一位后面直接截掉(结果为0x4003B851EB851EB8),这就造成了保存的值比实际的2.465稍微小一点。0x4003B851EB851EB8转换成十进制后值约为2.4649999999999999。

Round函数只是对保存的值进行了四舍五入,没有任何问题。若选择使用精确数值类型,可以有效地避免这种问题的发生。

五.    参考文献

1.    http://blog.csdn.net/YUKUILONGQQ/archive/2008/10/27/3157627.aspx

2.    http://blog.sina.com.cn/s/blog_4c7fa77b01000ai2.html

我写了一个程序,模拟浮点数的内存格式,下载地址为:http://download.csdn.net/source/2233150

计算机中浮点数的表示,浮点数在计算机中的表示相关推荐

  1. 浮点数在计算机中起什么作用,浮点数在计算机中的存储表示

    今天在看面试宝典,注意到上面所说浮点数在内存里和整数的存储方式不同,但究竟有何不同呢? 在网上搜了一下: 在http://blog.csdn.net/djsl6071/archive/2007/03/ ...

  2. 【汇编语言与计算机系统结构笔记03】浮点数的计算机表示,IEEE 754,舍入(rounding),C语言中的浮点数

    本次笔记内容: 04.浮点数的计算机表示 文章目录 IEEE的浮点数标准 IEEE的754标准 浮点数示例 计算机中浮点数二进制表示 浮点数的类型 规格化浮点数(Normalized) 规格化浮点数示 ...

  3. 单精度在计算机中的存储,浮点数(单精度浮点数与双精度浮点数)在计算机中的存储...

    浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数.科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分 ...

  4. 《计算机组成原理》----2.6 浮点数

    本节书摘来自华章出版社<计算机组成原理>一书中的第2章,第2.6节, 作 者 Computer Organization and Architecture: Themes and Vari ...

  5. 用计算机浮点数表示法计算,计算机组成原理第4章浮点数运算方法ppt课件

    PPT内容 这是计算机组成原理第4章浮点数运算方法ppt课件下载,主要介绍了浮点数的表示:浮点加减运算:浮点加减运算的步骤:浮点数加减运算流程图:浮点加减法运算:浮点运算所需的硬件配置,欢迎点击下载. ...

  6. 【学习笔记】【计算机组成原理】定点数与浮点数的运算;LRU算法实现;cache命中;流水线冲突、冲刷;

    目录 前言 一.计算机组成原理-背景 1.计算机的发展简史 2.计算机的分类 3.计算机的体系结构 4.计算机的层次与编程语言 5.计算机的计算单位 6.计算机的字符与编码集 二.计算机组成原理-组成 ...

  7. 计算机浮点数的知识,浮点数基础知识科普

    浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数 ...

  8. 计算机组成原理(六)-浮点数存储和浮点数计算

    你的程序.打开的文本为什么老是乱码?先来认识一下世界的编码集 ASCII:因为最开始计算机是美国人发明的,所以最早的编码集只为美国服务,包含95个可打印字符,33个不可打印字符(包括控制字符)一共12 ...

  9. 计算机组成原理浮点规格化,规格化浮点数

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 规格化浮点数又称格式化输出,是指把一个浮点数按指定的格式进行转换.通常在报表统计展示.数据计算存储时需要格式化,常用的格式化函 ...

最新文章

  1. easyui 通用的datagrid中如何带有查询条件分页
  2. 全新SpringBoot整合Elasticsearch6.xxx搜索引擎实战
  3. asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?...
  4. 二叉查找树--插入、查找、遍历、打印、删除(重点)
  5. 自定义IDM的网页嗅探下载浮条样式
  6. linux自动联想,在联想扩展坞和Linux上自动切换显示
  7. python if函数两个并列条件怎么用_IF函数,多个条件怎么用
  8. PTA-数据库作业题(二)
  9. 产品 • B端和C端产品经理有什么区别?
  10. 微信小程序输出Object,Object
  11. java 模块解耦_微服务架构:如何用十步解耦你的系统?
  12. 形象标识 新松机器人_新松机器人自动化股份有限公司
  13. yara规则--编写
  14. Tkinter写一个音乐下载器
  15. 百度地图 地址查询经纬度 插件vue-baidu-map
  16. Oracle 11g使用Net Configuration Assistant工具配置监听程序
  17. leetcode:77.组合
  18. 国外调查问卷项目赚美金
  19. linux 系统迁移到固态硬盘,Linux系统迁移记录(从HDD到SSD)
  20. cv2.copyMakeBorder

热门文章

  1. CentOS升级或安装安装JDK 8
  2. 计算机图形学绪论:感知、光、颜色和数学
  3. 软件工程导论患者监护系统可行性研究
  4. mac os 更改mac地址
  5. Cadence OrCAD 原理图栅格样式的大小设置方法图文教程及视频演示
  6. 【win+linux双系统如何正确卸载linux系统】
  7. 在windows上部署IIS web服务
  8. 什么是 SSH 以及常见 ssh 用法
  9. VLOOKUP函数最常用的10种用法
  10. Value cannot be null. (Parameter ‘connectionString‘)