定点数和浮点数-小数的表示法
1个回答
展开全部
在计算机存储中,如何表示小数呢?两种常用的方法:定点法和浮点法。
指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
用二进制来表示小数
其实,整数和小数的主要区别,我们可以 不规范地 理解为是否存在小数点,对吧?(其实整数也是有小数点的,我们这里暂且这么理解)那么要表示小数,只需要在整数表示的基础上,加一个小数点,不就可以了吗?没错,这就是定点数的思路。
定点数 使用 二进制 ,小数点的位置是 事先约定好的 ,在使用的过程中 不能改变 ,这也是定点数的名称的由来。有的同学可能会问了,那么,小数如何从十进制换成定点数呢?不着急,且看下面的例子:
其实很简单,和整数部分的 完全相反 。连续将小数部分的值 乘以2 ,对于每一次得到的数,若整数为0,则 顺序 记下一个0,若整数 突破了1 ,则记下1,然后整数部分 重置为0 ,小数部分 继续重复 上述操作, 直到 小数部分为0为止。就像下面这样:
十进制的0.125
0.125*2=0.25 (记下0)
0.25*2=0.5 (记下0,则目前为00)
0.5*2=1.0 (整数部分为1,记下1,则目前为001)
小数部分为0,转换结束(这里是刚好结束,若整数位进一后小数部分还有剩余,则把整数部分变成0再继续重复上面的算法)
则十进制0.125的二进制形式为0.001
二进制转十进制:
看懂了吧,从小数点开始 往右数 ,第一位小数的位权为-1,后面-2,-3以此类推。
二进制小数点向左移动一位,相当于这个数的数值 除以 2;相反,向右移动一位就是 乘以 2。
一般在现在计算机的应用中,定点数一般只有两种情况,第一种是小数点在 符号位之后 ,也就是表示 纯小数 ,第二种是在 最后 ,也就是表示 整数 。这种表示方法的范围并不大,如果需要表示类似于
这样的数值的话,那么用定点数的话就会占很大的空间。(毕竟你要很多很多个0才行,对吧)于是乎,我们的先人又开始秀智商了。
浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均带符号数。尾数的符号表示数的正负,阶码的符号则表明小数点的实际位置。
浮点数:表示更大范围的小数
上面的例子我们已经看到了定点数的局限性,于是,先人们就祭出了浮点数大法,来让我们更好地表示数(tuō)字(fà)。
如果上面的例子还不能够说服你的话,我下面再举个栗子:
表示一组数,0.123,1.23,12.3,123
如果此时你用定点数来表示的话,你会发现,这四组数字的表示方法 完全不同 。但是,我们的数学经验却又告诉我们,这几个数字其实是可以用一种 通式 来表示的,你应该已经想到了,就是 科学计数法 。如果使用科学计数法,那么这几组数字的通式可以表示为
。貌似比什么定点数方便多了。
但是,我们知道,计算机是用来处理二进制的,那么,我们在二进制里面,可不可以打造一套 类似于科学计数法 的思路来表示小数呢——这就是浮点数的基本思路。浮点数的表示方法 有点类似 科学计数法,但是又比科学计数法要复杂。
不多废话,我们来看看到底有什么猫腻。
在IEEE 754中,规定了浮点数用以下形式来表示:
有点懵?先不着急,首先这个公式的三个部分,分别是符号位*尾数*阶码
符号位(Sign):决定这个数是正数(S=0)还是负数(S=1);
尾数(Frac):决定这个数的精度以及主体部分,这里采用定点法表示;
阶码(Exp):决定这个数的范围,它是一个加权值,权重是2的E次幂。
浮点数常用的有两种:单精度浮点数和双精度浮点数。
单精度浮点数用32bit来存储,其结构如下:
| S(1bit) || Exp(8bit) || Frac(23bit) |
而双精度浮点则使用64bit来存储,结构如下:
| S(1bit) || Exp(11bit) || Frac(52bit) |
我们现在知道了浮点数的封装结构,那我们接下来来了解下它是如何表示小数的。
规格化的值
当Exp字段 不全为0 或 不全为1 时,表示的就是规格化的值。这几乎表示了 绝大部分 日常浮点数的情况。
此时,阶码使用 移码 来表示。什么是移码呢?我们要知道,Exp字段是表示 无符号数字 的,这样更方便计算(不用涉及到反码什么的)。但是,我们日常生活中,指数是可能为负数的,对吧?那么如何使用无符号的数字来表示有符号的数字呢?很简单,加个 偏移量 就行了。比如我们现在要表示-5到+5的数字,但是我们必须要用无符号来表达,那么很自然,我们把这里面所有的数字都加个5,变成了0到10,那么系统要调用的时候,再把每个值都减去5即可。这个 5 实际上就是 偏移量 。那么这个偏移量我们怎么知道呢?记住公式即可
,其中Bias就是 偏移量 。既然都讲到了Exp字段,自然是要来算指数了,那么指数E该怎么求出?还是公式:
,直接减去偏移量即可。
而Frac则用来表示 尾数 的(用 定点数 的方式表达, 纯小数 )。尾数定为
,你可以理解为这种情况下,尾数中的1是白送的,加上去即可。
非规格化的值
当Exp字段 全部为0 时,就是非规格化的值,此时
,
。此刻,尾数的值 就是 小数的值,整数部分不是1而是0,这种情况用于表示 很接近 0.0的小数。
无穷大
当Exp字段 全为1 且Frac字段 全为0 时,则表示无穷大。若
则表示
,
则表示
。
NaN(Not a Number)
在无穷大的情况下
时,表示 不是实数 或者 不能使用无穷大表示 的情况。
说了那么多,大家估计也有点晕了,我们不妨再来两个栗子看看到底该怎么使用上述的方法。
先看看浮点数转为我们能看得懂的小数。
某天,Harris碰到了一个浮点数
1 01111100 11100000000000000000000
首先我们看到 符号位 ,是1,说明这玩意儿是个 负数 ,再看看阶码,杂乱无章,想必就是 规格化的值 了。好的,套方法。先把尾数转化
,再白嫖个1,那么就是
。尾数部分搞定了,再看看指数。
偏移量
,指数E于是就顺水推舟
再利用上述的公式
上述方法大家应该都能看懂,我们再来看看我们常用的十进制小数如何转化成浮点数表示。
来个简单点的,就3.125吧。
首先,我们将这个小数用 定点数 的方法表示出来
完成转换之后,我们可以得到
,于是E就等于了1,尾数部分把 白嫖的1 还回去
假设我们转换成 单精度浮点 ,则偏移量
,
又由于这货是个 正数 ,符号位是0,于是,浮点数表示就出来啦:
0 10000000 10010000000000000000000
其实还是挺简单的,对吧?
定点表示法分为纯整数表示法和和纯小数表示法。
# 纯整数表示法
最高位是符号位,小数点默认隐含在数值位末尾的后一位,数值位是整数部分的二进制。
# 纯小数表示法
最高位是符号位,小数点默认隐含在符号位和数值位之间,数值位是小数部分的二进制。
其中绿色部分是符号位(占1位),蓝色部分是阶码(占8位),黄色部分是尾数(占23位)
#浮点数的一般形式
定点数受字长的限制,超出范围会有溢出。浮点数的精度由尾数决定,数的表示范围由阶码决定。
指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
用二进制来表示小数
其实,整数和小数的主要区别,我们可以 不规范地 理解为是否存在小数点,对吧?(其实整数也是有小数点的,我们这里暂且这么理解)那么要表示小数,只需要在整数表示的基础上,加一个小数点,不就可以了吗?没错,这就是定点数的思路。
定点数 使用 二进制 ,小数点的位置是 事先约定好的 ,在使用的过程中 不能改变 ,这也是定点数的名称的由来。有的同学可能会问了,那么,小数如何从十进制换成定点数呢?不着急,且看下面的例子:
其实很简单,和整数部分的 完全相反 。连续将小数部分的值 乘以2 ,对于每一次得到的数,若整数为0,则 顺序 记下一个0,若整数 突破了1 ,则记下1,然后整数部分 重置为0 ,小数部分 继续重复 上述操作, 直到 小数部分为0为止。就像下面这样:
十进制的0.125
0.125*2=0.25 (记下0)
0.25*2=0.5 (记下0,则目前为00)
0.5*2=1.0 (整数部分为1,记下1,则目前为001)
小数部分为0,转换结束(这里是刚好结束,若整数位进一后小数部分还有剩余,则把整数部分变成0再继续重复上面的算法)
则十进制0.125的二进制形式为0.001
二进制转十进制:
看懂了吧,从小数点开始 往右数 ,第一位小数的位权为-1,后面-2,-3以此类推。
二进制小数点向左移动一位,相当于这个数的数值 除以 2;相反,向右移动一位就是 乘以 2。
一般在现在计算机的应用中,定点数一般只有两种情况,第一种是小数点在 符号位之后 ,也就是表示 纯小数 ,第二种是在 最后 ,也就是表示 整数 。这种表示方法的范围并不大,如果需要表示类似于
这样的数值的话,那么用定点数的话就会占很大的空间。(毕竟你要很多很多个0才行,对吧)于是乎,我们的先人又开始秀智商了。
浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均带符号数。尾数的符号表示数的正负,阶码的符号则表明小数点的实际位置。
浮点数:表示更大范围的小数
上面的例子我们已经看到了定点数的局限性,于是,先人们就祭出了浮点数大法,来让我们更好地表示数(tuō)字(fà)。
如果上面的例子还不能够说服你的话,我下面再举个栗子:
表示一组数,0.123,1.23,12.3,123
如果此时你用定点数来表示的话,你会发现,这四组数字的表示方法 完全不同 。但是,我们的数学经验却又告诉我们,这几个数字其实是可以用一种 通式 来表示的,你应该已经想到了,就是 科学计数法 。如果使用科学计数法,那么这几组数字的通式可以表示为
。貌似比什么定点数方便多了。
但是,我们知道,计算机是用来处理二进制的,那么,我们在二进制里面,可不可以打造一套 类似于科学计数法 的思路来表示小数呢——这就是浮点数的基本思路。浮点数的表示方法 有点类似 科学计数法,但是又比科学计数法要复杂。
不多废话,我们来看看到底有什么猫腻。
在IEEE 754中,规定了浮点数用以下形式来表示:
有点懵?先不着急,首先这个公式的三个部分,分别是符号位*尾数*阶码
符号位(Sign):决定这个数是正数(S=0)还是负数(S=1);
尾数(Frac):决定这个数的精度以及主体部分,这里采用定点法表示;
阶码(Exp):决定这个数的范围,它是一个加权值,权重是2的E次幂。
浮点数常用的有两种:单精度浮点数和双精度浮点数。
单精度浮点数用32bit来存储,其结构如下:
| S(1bit) || Exp(8bit) || Frac(23bit) |
而双精度浮点则使用64bit来存储,结构如下:
| S(1bit) || Exp(11bit) || Frac(52bit) |
我们现在知道了浮点数的封装结构,那我们接下来来了解下它是如何表示小数的。
规格化的值
当Exp字段 不全为0 或 不全为1 时,表示的就是规格化的值。这几乎表示了 绝大部分 日常浮点数的情况。
此时,阶码使用 移码 来表示。什么是移码呢?我们要知道,Exp字段是表示 无符号数字 的,这样更方便计算(不用涉及到反码什么的)。但是,我们日常生活中,指数是可能为负数的,对吧?那么如何使用无符号的数字来表示有符号的数字呢?很简单,加个 偏移量 就行了。比如我们现在要表示-5到+5的数字,但是我们必须要用无符号来表达,那么很自然,我们把这里面所有的数字都加个5,变成了0到10,那么系统要调用的时候,再把每个值都减去5即可。这个 5 实际上就是 偏移量 。那么这个偏移量我们怎么知道呢?记住公式即可
,其中Bias就是 偏移量 。既然都讲到了Exp字段,自然是要来算指数了,那么指数E该怎么求出?还是公式:
,直接减去偏移量即可。
而Frac则用来表示 尾数 的(用 定点数 的方式表达, 纯小数 )。尾数定为
,你可以理解为这种情况下,尾数中的1是白送的,加上去即可。
非规格化的值
当Exp字段 全部为0 时,就是非规格化的值,此时
,
。此刻,尾数的值 就是 小数的值,整数部分不是1而是0,这种情况用于表示 很接近 0.0的小数。
无穷大
当Exp字段 全为1 且Frac字段 全为0 时,则表示无穷大。若
则表示
,
则表示
。
NaN(Not a Number)
在无穷大的情况下
时,表示 不是实数 或者 不能使用无穷大表示 的情况。
说了那么多,大家估计也有点晕了,我们不妨再来两个栗子看看到底该怎么使用上述的方法。
先看看浮点数转为我们能看得懂的小数。
某天,Harris碰到了一个浮点数
1 01111100 11100000000000000000000
首先我们看到 符号位 ,是1,说明这玩意儿是个 负数 ,再看看阶码,杂乱无章,想必就是 规格化的值 了。好的,套方法。先把尾数转化
,再白嫖个1,那么就是
。尾数部分搞定了,再看看指数。
偏移量
,指数E于是就顺水推舟
再利用上述的公式
上述方法大家应该都能看懂,我们再来看看我们常用的十进制小数如何转化成浮点数表示。
来个简单点的,就3.125吧。
首先,我们将这个小数用 定点数 的方法表示出来
完成转换之后,我们可以得到
,于是E就等于了1,尾数部分把 白嫖的1 还回去
假设我们转换成 单精度浮点 ,则偏移量
,
又由于这货是个 正数 ,符号位是0,于是,浮点数表示就出来啦:
0 10000000 10010000000000000000000
其实还是挺简单的,对吧?
定点表示法分为纯整数表示法和和纯小数表示法。
# 纯整数表示法
最高位是符号位,小数点默认隐含在数值位末尾的后一位,数值位是整数部分的二进制。
# 纯小数表示法
最高位是符号位,小数点默认隐含在符号位和数值位之间,数值位是小数部分的二进制。
其中绿色部分是符号位(占1位),蓝色部分是阶码(占8位),黄色部分是尾数(占23位)
#浮点数的一般形式
定点数受字长的限制,超出范围会有溢出。浮点数的精度由尾数决定,数的表示范围由阶码决定。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询