浮点数计算机内表示及计算

浮点数即带有小数的数,是不精确的

在计算机内表示:f = (-1)^S * M * 2^E 

S(符号数) E(指数) M(尾数) 表示公式 偏移量
1 8 23 (-1)S*2(P-127)*1.M 127
1 11 52 (-1)S*2(P-1023)*1.M 1023

例如:

浮点数4.5计算机内表示为:

100.1=(-1)^0 * 1.001 * 2^2

S=0

M=001(有效位不带整数部分的1,只记录小数部分)

E=2+127(偏移量)=129

最终表示:

0 10000001 00100000000000000000000

 

浮点数运算:

先介绍二进制运算

      对于有符号数而言:

      (1)二进制的最高位是符号位:0表示正数,1表示负数

      (2)正数的原码、反码、补码都一样;

      (3)负数的反码 =  它的原码符号位不变,其他位取反(0 ->1 ; 1->0 );

      (4)负数的补码 = 它的反码 +1;

      (5)0的反码、补码都是0;

      (6)在计算机运算的时候,都是以补码的方式来运算的;

具体例子可见:https://www.cnblogs.com/fuhaots2009/p/3476502.html

其中补码计算时要计算符号位,补码运算结果的符号位为0,则得到的结果就是该正数,若结果的符号位为1,则对结果进行逆运算得到原码,即减一取反。

 

浮点数计算规则(引用自https://www.cnblogs.com/jasonlixuetao/p/5528448.html

设X=Mx*2^Ex,Y= My*2^Ey,求X±Y=?

•规则:

–对阶:DE=Ex-Ey;小阶向大阶看齐。

–实现尾数的加(减)运算。

–规格化处理

  •如果结果的两个符号位的值不同,表示运算尾数结果溢出,应“右规”,即尾数结果右移一位,阶码+1

  •如果最高数值位与符号位相同,应“左规”,此时尾数连续左移,直到最高数值位与符号位的值不同为止;同时从阶码中减去移位的位数

–舍入处理

–检查是否溢出

 

例:

•X=2^(010)·0.11011011,    Y=2^(100)·(-0.10101100)

•计算过程:

–①对阶操作:阶差△E=[Ex]补+[-Ey]补=00010+11100=11110

                            X阶码小,Mx右移2位,保留阶码E=00100

                            [Mx]补=00 00110110 11

–②尾数相加:[Mx]补+[My]补=00 00110110 11+11 01010100

                             =11 10001010 11

–③规格化操作:左规,移一位,结果=11 00010101 10

                                阶码减1,E=00011

–④舍入:附加位最高位为1,在结果的最低位+1,

                     得新结果[M]补=11 00010110,M=-0.11101010

–⑤判溢出:阶符为00,不溢出,最终结果为

X+Y=2011·(-0.11101010)

 

例子:

double x=0.04,y=0.03;

x-y=0.010000000002 不等于0.01

所以程序中不能对浮点数进行逻辑大小判断。

设计金额的都要用bigdecimal。

你可能感兴趣的:(学习)