作者:Binggo89 | 来源:互联网 | 2023-08-15 07:05
计算机里用二进制科学计数法表示小数,so
float: 32位
double : 64位
二进制表示法: 符号位数 阶码位数 尾数位数
float : 1 8 23
double : 1 11 52
-----十进制数字转为浮点数二进制科学技术法过程--------------
1. 数字(10)= 整数部分+小数部分
a. 整数部分---> 16进制---->二进制 (高位的0去掉)
b: 小数部分转为二进制数字,与十进制的对应关系如下
十进制数 二进制数
2的-1次方 0.1
2的-2次方 0.01
2的-3次方 0.001
依此类推,即,0.5(10)对应0.1(2), 2的-n次方中的n对应小数点后,二进制的1所在位数
据此,把十进制数字拆分为 0.5*0+0.25*0+.... 的形式,并根据二进制数和十进制数的对应关系转为二进制数
c. 数字(10)的二进制数即为 整数部分二进制数 . 小数部分二进制数
d. 二进制数小数点左移至最高位1的后方,去掉最高位1,剩余部分即为位数部分,不足23位的,低位补0
2. 小数点左移量+2的阶码位数减去1的次方-1 --->16进制---->2进制,即为阶码部分
3. 如果是正数,则在阶码二进制数字前补一个0; 负数在阶码数字前补0至阶码最高位,符号位填1
4. 组合符号位+阶码部分+尾数部分 , 即为该数字的浮点数二进制科学计数法表示方式。
---------------------举例------------------------------
例1. 38414.4(10)转为double型
1. 符号位为0,价码11位, 尾数52位
38414.4=38414.4+0.4 ;
38414(10)= 960E (16)= 1001 0110 0000 1110 (2); 0.4(10) =0.5×0+0.25×1+0.125x1+0.0625x0+0.03125x0...= 0.0110 ... // 此处无法除尽,要算满36位, 以补足加上整数部分后,整个尾数部分要有52位
38414.4(10)= 1001 0110 0000 1110 . 0110 ....(2)
小数点左移15位即为 1. 001 0110 0000 1110 0110... x 2的15次方,去掉最高为的1后,尾数 001 0110 0000 0110 ...
2. 小数点左移量为15; double的阶码位数为11位,即偏移量修正值为 2^(11-1)-1=1023;
15+1023=1038(10)----> 40E(16)---->0100 0000 1110 (2)
3. 正数 ,不需要扩展
4. 阶码+尾数,最终结果 即为double 型 0100 0000 1110 001 0110 0000 0110.... (尾数部分的小数要算满到补足尾数的52位)
例2. -12.5(10)转为 float 型
1. 符号位 位1, 阶码8位, 尾数 23位
12.5=12+0.5= 1100.1 (2)
小数点左移3位, 即为 1.1001. 去掉最高位1, 尾数部分为 1001
2. 小数点左移量为3; float阶码位数为8,即偏移量修正值为2^(8-1)-1=127;
3+127=130(10) --->82(16) ---> 1000 0010(2)
3. 负数,符号位为1
4. 符号位+阶码+尾数,最终结果为 1 1000 0010 1001 0000 0000 0000 000