算法:
公式:表示的浮点数大小是:X=(-1)^sign * 1.fraction * 2^(exponent - bias)。
sign=正负(0为正,1为负)
fraction=X转成二进制后除去第一位后的数字
Bias=单精度是127/双精度是1023
exponent= bias+(X的二进制移位成1.fraction的移位数)
尾数=1.fraction
范例:
以32位单精度浮点数为例(float),其具体的转换规则是:
首先把二进制小数(补码)用二进制科学计数法表示,
以十进制下的12.5为例,首先12.5非负,所以符号位为0;
12.5转换为二进制,1100.1;
将其科学计数法化(正规化),变成了 1.1001*2^(3);
可知道此时2的指数为3,加上预设的偏移值127,得到了130,即1000 0010;这就是指数部分。
(1.1001)去掉整数得到尾数1001,剩余尾数补0,这就是尾数部分。
以最终的IEEE754单精度值(32位)为
0 100 0001 0 100 1000 0000 0000 0000 0000
符号 【指数部分】 【尾数部分(23位) 】
整合为16进制,为41 48 00 00 。
再以-0.375为例,符号位为1;
0.375转换为二进制,0.011,科学计数法化(正规化),1.1*2^(-2)
可知2的指数位-2,加上127为125,即0111 1101;
(1.1)去掉整数得到尾数1,剩余尾数补0
最终为1 0111 1101 1000 0000 0000 0000 0000 000
整合为16进制,为BE C0 00 00。
加法: 1.首先统一指数部分,将小的忘大的地方变,加多少则尾数右移多少,减多少则尾数左移多少;
(注)即(1) 0011 0011 0011 0011 0011 001 -> (0) 1001 1001 1001 1001 1001 100
尾数相加得到结果的尾数。
范例:
0.3= 1.0011 0011 0011 0011 0011 001
0.3= 0 011 1110 1 001 1001 1001 1001 1001 1001
125
0.7= 1.0110 0110 0110 0110 0110 011
0.7= 0 011 1111 0 011 0011 0011 0011 0011 0011
126
0.3右移一位
(1) 0011 0011 0011 0011 0011 001 -> (0) 1001 1001 1001 1001 1001 100
尾数相加0.100 1100 1100 1100 1100 1100 + 1.011 0011 0011 0011 0011 0011
= 1.111 1111 1111 1111 1111 1111
实际数据是
0 011 1111 0 111 1111 1111 1111 1111 1111
X=(-1)^0 * 1.111 1111 1111 1111 1111 1111 * 2^(126 - 127)
= 0.99999994039536
=1(四舍五入)
注意:如果是正负相加,负数需要取补码进行相加操作,并扩展符号位,
观察结果的正负性;如果结果的整数部分大于1,要进行科学计数法化(正规化)。
浮点数乘法:
1.尾数相乘,得到结果,以12.5和-0.375为例,相关的浮点数表示在介绍IEEE754环节已给出;
12.5 ->41 48 00 00 ; -0.375 -> BE C0 00 00
12.5=1.1001*2^3
12.5 =0 100 0001 0 100 1000 0000 0000 0000 0000
X=(-1)^0 * 1.100 1000 0000 0000 0000 0000 * 2^(130 - 127)。/3
-0.375=1.1*2^(-2)
-0.375=1 011 1110 1 100 0000 0000 0000 0000 0000
X=(-1)^1 * 1.100 0000 0000 0000 0000 0000 * 2^(125 - 127)。/-2
1.1001*1.1=10.01011000 /1
2.计算两者的exponent差值,得到结果3-2=1;将1中的结果科学计数法化(正规化),
10.01011000=1.001011000*2^1
得到最终的exponent为127+1+1=129;
3.将两者的符号位做异或计算,得到结果1,
所以最终结果的符号位为1;
最终结果为C0 96 00 00,转换为10进制就是-4.6875 。
-4.6875=1 100 0000 1 001 0110 0000 0000 0000 0000
ip调用:floating-point