吴树根ID:treeroot
136940次访问,排名544好友1人,关注者24
爱好围棋,热爱生活
treeroot的文章
原创 99 篇
翻译 1 篇
转载 12 篇
评论 109 篇
treeroot的公告
blog,simple the best!
最近评论
zhangying521998:如果你把test函数修改一下,更改list的引用。你会发现主函数中list没有影响。所以java还是值传递
agjyfm:wow gold
agjyfm:wow gold
wolfbrood:如果第二人先用的话,那就会使两个人都在等待状态。
doublefeng:两倍+1
文章分类
收藏
相册
inner
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 Java中float的取值范围收藏

新一篇: int转换到String方法的选择 | 旧一篇: 理解Java类加载原理(翻译)

规格化表示
       java中的浮点数采用的事IEEE Standard 754 Floating Point Numbers标准,该标准的规范可以参考http://blog.csdn.net/treeroot/articles/94752.aspx.
      float占用4个字节,和int是一样,也就是32bit.
      第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.
      第2-9个bit表示指数,一共8为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127.
     剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).
     最后结果是:(-1)^(sign) * 1.f * 2^(exponent)
     这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数)
    2^(-126) ~~ 2(1-2^(-24)) * 2^127
    这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定.
   
非规格化表示:
    当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.
    取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为
2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.
 

其他特殊表示
    1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0x80000000表示负0.
    2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.
    3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.
 
结论:
    可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.

发表于 @ 2004年09月05日 14:04:00|评论(loading...)|编辑

新一篇: int转换到String方法的选择 | 旧一篇: 理解Java类加载原理(翻译)

评论

#Aimon 发表于2005-11-02 09:50:00  IP: 222.209.1.*
果然是高手啊,佩服佩服!
以后有机会还要多像楼主请教哦。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © treeroot