二进制小数与浮点数的存储

小数二进制的转换和浮点数的存储是两个不太相关的内容,所以本文分两个主题分别记录。

进制转换

十进制整数转二进制

除二取余法,余数倒排。
原理来源于:
十进制:123=1*10^{2}+2*10^{1}+3*10^{0}
二进制:1011=1*2^{3}+0*2^{2}+1*2^{1}+1*2^{0} = 11
反向求解的时候就是除2(基数)取余。

11 ÷ 2 = 5 余 1
5 ÷ 2 = 2 余 1
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
得到二进制:1011

十进制小数转二进制

乘二取整。
原理来源于:
十进制:0.123=1*10^{-1}+2*10^{-2}+3*10^{-3}
二进制:0.1011=1*2^{-1}+0*2^{-2}+1*2^{-3}+1*2^{-4} = 0.6825
反向求解的时候就是乘2(基数)取整:

0.6825 * 2 = 1.375  拿走整数部分1,剩0.375
0.375 * 2 = 0.75  拿走整数部分0,剩0.75
0.75 * 2 = 1.5 拿走整数部分1,剩0.5
0.5 * 2 = 1 拿走整数部分1,剩0,结束
得到二进制:0.1011

通过上面的运算可以知道:11.6825转成二进制是:1011.1011
另外一个规律:小数尾数为5(x.5、x.25、x.xxxxx5)才能用完整的二进制表示,不然一直乘2小数部分永远不能为0。
快速运算:

0.1(二进制)=0.5(十进制)
0.01(二进制)=0.25(十进制)
0.001(二进制)=0.125(十进制)
……

小数存储

我们假设,小数点存储在中间(定点数),假设用8bit来存储小数:
1011 1011就等于1011.1011。用16bit来存储小数:0000 1011 1011 0000就等于1011.1011。
以上只是我们的假设,为了统一,现在计算机都采用IEEE 754的标准来存储小数(浮点数)。有单精度(32bit)和双精度(64bit)两种。

image.png

统一公式:V=(-1)^s*2^{E}*M
其中s为符号位,E为阶码,M为尾数。
s为所见即所得,0正数,1负数。
E为移码表示,移Bias=2^{N-1}-1,相当于加上2^{N-1}-1,Bias称偏移量。
M为尾数,隐藏最高位1,相当于计算尾数时,要加上1。

以0.4375为例,因为M尾数最高位要为1,也就是我们要想办法让0.4375表示成1.xxx * 2^{E}的形式:0.4375 = 1.75 * 2^{-2}
用单精度表示,偏移量为2^ {8-1} -1 = 127
0.4375 = (-1)^{0} * 2^{-2+127} * 1.75 = 2^{125} * 1.75
现在的任务变成了将125和1.75(需要隐藏高位1,变成0.75)转换成二进制:
125 = 0111 1101(8位)0.75 = 1100 0000 0000 0000 000(23位)
所以0.4375的浮点数表示就是:0011 11110 1110 0000 0000 0000 0000 0000

image.png

在线转换网址

同理,将0011 11110 1110 0000 0000 0000 0000 0000 转换成小数就是:

阶数:0111 1101 = 125,实际 125 - 127(偏移量) = -2
尾数:1100 0000 0000 0000 000 = 0.11(二进制) = 0.5+0.25=0.75(十进制)
尾数补隐藏位1:1+0.75=1.75

原小数:-1^{0} * 2^{-2} * 1.75 = 0.4375

双精度浮点数的偏移量:2^{11-1} -1 =1023

利用java转换

long l = Double.doubleToLongBits(0.4375);
System.out.println(l);
// 11111111011100000000000000000000000000000000000000000000000000
System.out.println(Long.toBinaryString(l));

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

推荐阅读更多精彩内容