小数表示法(定点法、浮点法)

小数表示法(定点法、浮点法)

——TechZone(Harris)


​ 在计算机的数据存储里面,常规思路来看,是只能表示有限位数整数的。但是,无论是在日常生活中,还是在科学研究领域,小数(严格来讲应该是分数)都是不可或缺的部分。那么,如何让计算机能够存储并使用小数呢?这篇文章就带大家一起来了解下两种常用的小数表示法:定点法浮点法

定点数:用二进制来表示小数

​ 其实,整数和小数的主要区别,我们可以不规范地理解为是否存在小数点,对吧?(其实整数也是有小数点的,我们这里暂且这么理解)那么要表示小数,只需要在整数表示的基础上,加一个小数点,不就可以了吗?没错,这就是定点数的思路。

定点数使用二进制,小数点的位置是事先约定好的,在使用的过程中不能改变,这也是定点数的名称的由来。有的同学可能会问了,那么,小数如何从十进制换成定点数呢?不着急,且看下面的例子:

其实很简单,和整数部分的完全相反。连续将小数部分的值乘以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

二进制转十进制:

101.011_{(2)}

=1*2^2+0*2^1+1*2^0+0*2^{-1}+1*2^{-2}+1*2^{-3}

=5\frac{3}{8}

​ 看懂了吧,从小数点开始往右数,第一位小数的位权为-1,后面-2,-3以此类推。

​ 二进制小数点向左移动一位,相当于这个数的数值除以2;相反,向右移动一位就是乘以2。

​ 一般在现在计算机的应用中,定点数一般只有两种情况,第一种是小数点在符号位之后,也就是表示纯小数,第二种是在最后,也就是表示整数。这种表示方法的范围并不大,如果需要表示类似于2*10^{100}这样的数值的话,那么用定点数的话就会占很大的空间。(毕竟你要很多很多个0才行,对吧)于是乎,我们的先人又开始秀智商了。

浮点数:表示更大范围的小数

​ 上面的例子我们已经看到了定点数的局限性,于是,先人们就祭出了浮点数大法,来让我们更好地表示数(tuō)字(fà)。

​ 如果上面的例子还不能够说服你的话,我下面再举个栗子:

表示一组数,0.123,1.23,12.3,123

​ 如果此时你用定点数来表示的话,你会发现,这四组数字的表示方法完全不同。但是,我们的数学经验却又告诉我们,这几个数字其实是可以用一种通式来表示的,你应该已经想到了,就是科学计数法。如果使用科学计数法,那么这几组数字的通式可以表示为0.123*10^n。貌似比什么定点数方便多了。

​ 但是,我们知道,计算机是用来处理二进制的,那么,我们在二进制里面,可不可以打造一套类似于科学计数法的思路来表示小数呢——这就是浮点数的基本思路。浮点数的表示方法有点类似科学计数法,但是又比科学计数法要复杂。

​ 不多废话,我们来看看到底有什么猫腻。

​ 在IEEE 754中,规定了浮点数用以下形式来表示:V=(-1)^S*M*2^E

​ 有点懵?先不着急,首先这个公式的三个部分,分别是符号位*尾数*阶码

  • 符号位(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=2^{n-1}-1,其中Bias就是偏移量。既然都讲到了Exp字段,自然是要来算指数了,那么指数E该怎么求出?还是公式:E=Exp-Bias,直接减去偏移量即可。

    而Frac则用来表示尾数的(用定点数的方式表达,纯小数)。尾数定为M=1+Frac,你可以理解为这种情况下,尾数中的1是白送的,加上去即可。

  • 非规格化的值

    当Exp字段全部为0时,就是非规格化的值,此时E=1-BiasM=Frac。此刻,尾数的值就是小数的值,整数部分不是1而是0,这种情况用于表示很接近0.0的小数。

  • 无穷大

    当Exp字段全为1且Frac字段全为0时,则表示无穷大。若S=0则表示+\inftyS=1则表示-\infty

  • NaN(Not a Number)

    在无穷大的情况下Frac\neq0时,表示不是实数或者不能使用无穷大表示的情况。

说了那么多,大家估计也有点晕了,我们不妨再来两个栗子看看到底该怎么使用上述的方法。


先看看浮点数转为我们能看得懂的小数。

某天,Harris碰到了一个浮点数

1 01111100 11100000000000000000000

首先我们看到符号位,是1,说明这玩意儿是个负数,再看看阶码,杂乱无章,想必就是规格化的值了。好的,套方法。先把尾数转化

1*2^{-1}+1*2^{-2}+1*2^{-3}=\frac{7}{8},再白嫖个1,那么就是1\frac{7}{8}。尾数部分搞定了,再看看指数。

偏移量=2^{8-1}-1=127,指数E于是就顺水推舟E=01111100_{(2)}-127_{(10)}=124-127=-3

再利用上述的公式V=(-1)^S*M*2^E=(-1)^1*1\frac{7}{8}*2^{-3}=-\frac{15}{64}=-0.234375


上述方法大家应该都能看懂,我们再来看看我们常用的十进制小数如何转化成浮点数表示。

来个简单点的,就3.125吧。

首先,我们将这个小数用定点数的方法表示出来

3.125_{(10)}

=11.001_{(2)}

完成转换之后,我们可以得到11.001_{(2)}=1.1001*2^1,于是E就等于了1,尾数部分把白嫖的1还回去Frac=M-1=1.1001-1=0.10010000000000000000000

假设我们转换成单精度浮点,则偏移量Bias=2^{8-1}-1=127Exp=E+Bias=1+127=128_{(10)}=10000000_{(2)}

又由于这货是个正数,符号位是0,于是,浮点数表示就出来啦:

0 10000000 10010000000000000000000

其实还是挺简单的,对吧?


​ 好啦,今天的博客就到此结束了。这期实在是有点丰富,所以,一次性理解不了没关系,多自己在纸上写写,也许就开窍了呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354