浮点型在计算机存储包括三个部分:符号位(1位)+幂指位(8位或者11位)+数值位(23位或者52位)
float 32 = 1 + 8 + 23
double 64 = 1 + 11 + 52
将浮点型转化成二进制分为三步。
以35.25为例
1>将数值转化成二进制表示
整数部分:35 => 32 + 2 + 1 => 100011
小数部分:0.25 => 0.01
0.25*2=0.50 ——>取结果的整数位,下一次的取结果的小数位乘2———>整数位取出,小数位进入下一次
0.50*2=1.00 ——>取结果的整数位,下一次取结果的小数位乘2
0.00*2=0.00 ——>向后循环结果相同不必在做了。所以就是0.01
得到35.25的二进制10011.01
2>转化成科学计数法
10011.01=1.0001101*2(5) 这就是把小数点像左移动了5位所以就相当于1.0001101乘以2的5次方,类似于10进制科学技术法,左移几位乘以10的几次方。
3>对号入座
符号位1 + 幂指位8 + 数值位23
0 127+5(因为幂指数可能正也可能负所以计算机有一个中位数127,127+这个数的二进制就是幂指位的8位数,)
132=10000100 00011010000000000000000(因为第二部得出的科学技术法小数点左边一定是1所以省略,直接从小数点右边第一位开始写后面如果不够后面用0补齐23位(float型)或者52位(double型))
这样就得到了浮点数35.25在计算机底层的存储:01000010000011010000000000000000
总结:浮点数转化为二进制分为三部的:
1、将整数,小数分别转化为二进制表示。
这一部分整数转化为二进制之后左端不需要补0或1.小数转化为二进制的方法是把小数2得到的数整数作为二进制的第一位(从左到右),小数继续乘2然后得到的结果的整数作为二进制的第二位,小数下去继续乘。这样就可以得到******.****第一步完成
2、转化成科学技术法:
将小数点向左移动知道移动到最后一个1前面停止。移动了几位就是乘2的几次方。这样就完成了第二部
3、对号入座
符号位 + 幂指位 + 数值位
0或1 127+n的二进制 科学计数法.之后的所有数不够23位或者52后面补0/多余23或者52位就只截取23或52位
例题:
一:
25.625的二进制存储
25=16+8+1——>11001
0.625 * 2=1.25
0.25 * 2 = 0.5
0.5 * 2 = 1.0
0.0 * 2 = 0.0 ————>101
======> 11001.101===转化成科学技术法====> 1.1001101*2(4)
符号位 0
幂指位127+4=131 = 128+2+1————> 10000011
数值位:10011010000000000000000
所以25.625的二进制位:01000001110011010000000000000000
二:8.2
8=8——>1000
0.2*2=0.4
0.4*2=0.8
0.8*2=1.6
0.6*2=1.2
0.2*2=0.4
。
。————>001100110011[0011循环]
======>1000.001100110011[0011循环]===转变成科学计数法===>1.000001100110011[0011循环]*2(3)
符号位 0
幂指位 127+3=128+2——>10000010
数值位:00000110011001100110011
二进制:0 10000010 00000110011001100110011
由此可见因为0011是无限循环的,二进制只截取了前面的一些所以在存储时精度就发生了变化。所以计算机2.0-1.1并不等于0.9.因为1.1在存储时就发生了无限循环,直接去了全半段。