[note]浮点数二进制科学计数法

计算机里用二进制科学计数法表示小数,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

经验分享 程序员 微信小程序 职场和发展