zoukankan      html  css  js  c++  java
  • Java中浮点数能连续精确表示整数的范围

    转自http://blog.csdn.net/seizef/article/details/5571783#ref_1,有删改。

    先简单介绍一下浮点数在计算机中的组成,在Java中采用的浮点数表示法是IEEE754标准。

    任意一个二进制浮点数V可以表示成下面的形式,进一步说明请参照[1]

      

           (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

      (2)M表示尾数,范围是[1,2)(规格化)或者是[0,1)(非规范化)。

      (3)2^E表示阶码。

    当用浮点数来表示整数时,我们要得到连续的整数分布,肯定希望尾数的精度越高越好。显然,尾数的位数限制了能表示的最大的整数的值。对于一个浮点数,设p为其尾数的有效位数,那么最大的尾数就是1 + 1 - 2^(-p),所以最大的整数为(2-2^(-p)) * 2^(p) = 2^(p+1) - 1。由于浮点数是有符号的,所以很自然的我们想到整数范围为[-2^(p+1) – 1, 2^(p+1) – 1]。可是我们还遗漏了2个数,就是2^(p+1)和-2^(p+1)。我们来看这两个整数的浮点数表示。规格化后,2^(p+1) = (1.0000…000) * 2^(p+1),其中尾数部分小数点后有p+1个0。但是我们知道,我们的尾数最多只能存储p个0,,但是很巧,由于被舍去的最后一个数字是0,所以不影响实际取值,所以2^(p+1)就可以精确表示了。同理-2^(p+1)也是如此。

    注意,可能有读者会想到,既然1.00..000*2^(p+1)可以精确表示,那么很显然,对于单精度浮点数p=23,而指数的可表示范围-126~+127,那么为什么2^(p+1)就是可以表示的最大整数呢。因为我们文章的标题是连续精确表示整数的范围。2^(p+1),2^(p+2),2^(p+3)都可以精确表示,但是[2^(p+1), 2^(p+2)]之间还有许多数就无法表示了,因为尾数不够。

    所以对于IEEE754 单精度和双精度浮点数,能够精确表示的整数的范围为

    Floating Point Range
    float [-2^24,2^24]
    double [-2^53,2^53]

    [1]http://www.cnblogs.com/BJUT-2010/p/5551008.html

  • 相关阅读:
    BZOJ3527: [Zjoi2014]力(FFT)
    NOIP 2018游记
    BZOJ2763: [JLOI2011]飞行路线(分层图 最短路)
    11.7NOIP模拟赛解题报告
    交互体验之产品的文案
    关于java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决办法
    [置顶] android 与JavaScript的互相调用
    linux系统的文件类型学习
    VS2012 开发SharePoint 2013 声明式workflow action(activity)之 HelloWorld
    js判断浏览器类型 js判断ie6不执行
  • 原文地址:https://www.cnblogs.com/BJUT-2010/p/5565957.html
Copyright © 2011-2022 走看看