float类型的十进制转换成二进制数据的简单方法

阅读次数: 24

  • A+
所属分类:建站

刚看了一个视频教程是讲解内存内部是如何表示float类型数据的,其中讲到这个 float转二进制时,我是一脸懵逼。

现在做下笔录以防以后又忘记如何转换了。

首先我们给出几个小数

0.75

0.05

0.025

0.08

这四个,其实我想说大家不用记太多规则,只要记住乘2就行

例子一 0.75

0.75*2=1.5 大于1  二进制记  1  (此时是第一个1 所以位数(阶码 127-1=126 )也是1)
0.5*2=1.0 等于1 二进制记1
0.0*2=0.0 等于0 二进制记0 (从此以后都记0)
整理
尾数 10 后边补二十一个零 000000000000000000000
符号位 0 (因为是正数)
中间位 0111 1110 (126变的)
最终数
0 0111 1110 10 000000000000000000000
排版的结果
0011 1111 0100 0000 0000 0000 0000 0000

验证

float类型的十进制转换成二进制数据的简单方法

例子二 0.05

0.05*2=0.10 小于1 二进制为 0
0.10*2=0.20 小 二进制 0
0.20*2=0.40 二进制 0
0.40*2=0.80 二进制 0
0.80*2=1.60 大于1 二进制为1 (此时是第一个1 所以位数是5 (阶码 127-5=122))
0.6*2=1.2 大于1 二进制1
0.2*2=0.4 0 (看到这里此时数据开始循环了已经)
0.4*2=0.8 0
0.8*2=1.6 1
0.6*2=1.2 1
......... 0 0 11 00 11 00 11
整理
尾数 100 1100 1100 1100 1100 1100 (23位一共)
符号位 0(正数)
中间位 0111 1010 (122变的)
最终
0 0111 1010 100 1100 1100 1100 1100 1100
排版
0011 1101 0100 1100 1100 1100 1100 1100

验证

float类型的十进制转换成二进制数据的简单方法

这里验证结果并不对最后一位是错误的,我不知道是什么原因

第三个例子 0.025

0.025*2=0.05 0
0.05*2=0.10  0
0.10*2=0.20  0
0.20*2=0.40  0
0.40*2=0.80  0
0.80*2=1.60  1  第一个  1  位数是6 阶码 127-6=121
0.60*2=1.20  1
0.20*2=0.40  0
0.40*2=0.80  0
0.80*2=1.60  1
0.60*2=1.20  1
0.20*2=0.40  0
0.4*2=0.8    0
1.6          1
1.2          1
0.4          0
0.8          0
1.6          1
1.2          1 00 11 00 11 00
尾数 100 1100 1100 1100 1100 1100
符号位
0 正数
中间位
0111 1001  (121)
最终数
0 0111 1001 100 1100 1100 1100 1100 1100
整理
0011 1100 1100 1100 1100 1100 1100 1100

验证 结果却是 0011 1100 1100 1100 1100 1100 1100 1101 又是最后一位不对

第四个例子 0.08

0.08*2  0.16   0
0.16*2  0.32   0
0.32*2  0.64   0
0.64*2  1.28   1   4  127-4=123
0.28*2  0.56   0   尾数开始 
0.56*2  1.12   1  
0.12*2  0.24   0  
0.24*2  0.48   0
0.48*2  0.96   0
0.96*2  1.92   1
0.92*2  1.84   1
0.84*2  1.68   1
0.68*2  1.36   1
0.36*2  0.72   0
0.72*2  1.44   1
0.44*2  0.88   0
0.88*2  1.76   1
0.76*2  1.52   1
0.52*2  1.04   1
0.04*2  0.08   0   第16个
0.08*2  0.16   0   轮回开始
0.16*2  0.32   0
0.32*2  0.64   0
0.64*2  1.28   1
0.28*2  0.56   0
0.56*2  1.12   1
0.12*2  0.24   0  第二十三 尾数结束
0.24*2  0.48   0
尾数
010 0011 1101 0111 0000 1010
符号位 
0
中间数
0111 1011 (123) 
最终数
0 0111 1011 010 0011 1101 0111 0000 1010
排版
0011 1101 1010 0011 1101 0111 0000 1010

验证结果是 0011 1101 1010 0011 1101 0111 0000 1010 一模一样

最终结论 float类型数据 32位计算时 会使计算到三十三位 如果三十三位是零则 第二十二位 不变,如果是1则第二十二位变成1。

但例子中 并没有 筛选到 1011 而第三十三位也是1 的情况,不知1011是不变还是变成 1111 (应该是 保持不变,不然精度变化会太大,由于一直要进一,计算也会耗时不利于CPU性能)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: