对java中的浮点数表示的理解

浮点数 分为三部分表示,一是符号sign,用s表示,二是指数e,三是底数m。

对于一个32bit的数字,

第31位代表s位,第30-23位代表e,后面第22-0位代表m。

××××     ××××       ×  ×××     ××××     ××××     ××××    ××××     ××××

 

IEEE754的规定如下:

    int    s    =    ((bits    >>     31 )    ==     0 )    ?     1    :    - 1 ;   
   
int    e    =    ((bits    >>     23 )    &     0xff );   
   
int    m    =    (e    ==     0 )    ?    
                                    (bits   
&     0x7fffff )    <<     1    :   
                                    (bits   
&     0x7fffff )    |     0x800000 ;   

 

我将其用我的语言表达一下:

 


    int  s=第31位为0?正数:负数;
int  e=第30 - 23位数字表达成十进制数- 127 单精度(float)型的幂用加上127后用8位二进制数表示 );
float  m=(e! = 0 )?( 1 + (第22 - 第0位的二进制数表达为十进制数× 2 ^ ( - 23 )):
                                    (第22
- 第0位的二进制数表达为十进制数× 2 ^ ( - 23 )<<1):

 

问题1:当e!=0时,为什么要在m前面+1呢?实际上就是后23位前加入了“1.”,为了使得不同的二进制序列表达不同的意思,充分利用各个数字。则我们可能认为在后23位前加入了“0.”。

如果不加1,则0 000 0001 0 001 0000 0000 0000 0000 0000 表示(2^ -3)×2^2×2^(-127);

和0 000 0001 1 010 0000 0000 0000 0000 0000 :(2^ -2)×2^3 ×2^(-127);表达同一个数字,

两个编码表达同一个数字,这就是浪费,为了避免浪费,就在前面+1,这样

0 000 0001 0 001 0000 0000 0000 0000 0000 表示(1+2^ -3)×2^2×2^(-127);;

和0 000 0001 1 010 0000 0000 0000 0000 0000 表示(1+2^ -2)×2^3×2^(-127);

于是,这两个编码所表达的数字就不一样了。


问题二:当e=0时,为什么前面不加“1.”了呢?如果前面还+1,那最小的正数就变成

0 000  0000 0 000 0000 0000 0000 0000 0000:为1×2^(-127);感觉精度还不够精细,

另外,那样的话,0就没法表示了。所以,这个时候前面不加“1.”而加“0.”


问题三:当e=0时,前面加“0.”,这时计算m的时候为什么要左移一位呢?

这个个人认为是数字表达的连续,如果不左移一位,那我们在

0000 0000 0111 1111 1111 1111 1111 1111  不左移的话,表示为0.111……(23个1)×2^(-127)

0000 0000 1000 0000 0000 0000 0000 0000 表达数字1×2^1×2^(-127)之间有缺口,处于这两个浮点数之间的浮点数无法用二进制编码表示。为了填补这个缺口,我们宁可牺牲点精度。于是按照IEEE754约定

0000 0000 0111 1111 1111 1111 1111 1111  表达浮点数1.111……(22个1,最后一个编码为0)×2^(127);

与1×2^1×2^(-127)之间的差为2^(-23)×2^1×2^(-127),这个就是浮点数的精度

2×2^(-150),也是能表达的最小的浮点数:0000 0000 0000 0000 0000 0000 0000 0001。

于是,按照IEEE754那样表达浮点数,从理论上来说相对比较完善了。

希望大家看完之后,能受到点启发,加深对浮点数表示的理解。IEEE754是一个标准,制定标准的人自然考虑比较周全,他们那么表示自然有他们的理由,希望我的理解对了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值