转自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

Java中浮点数能连续精确表示整数的范围的更多相关文章

  1. java中浮点数的比较(double, float)(转)

    问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...

  2. 计算价格, java中浮点数精度丢失的解决方案

    计算价格, java中浮点数精度丢失的解决方案

  3. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    Java 中无锁的线程安全整数 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候, 不可避免的会用到synchron ...

  4. Java 中浮点数---------BigDecimal和double(初探)

    为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了 ...

  5. java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)

    原码:一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码. 但是原码有几个缺点,零分两种 +0 和 -0 .很奇怪是吧!还有,在进行不同符号的加法运 ...

  6. Java中浮点数的精度问题 【转】

    当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...

  7. Java中浮点数的坑

    基本数据类型 浮点数存在误差 浮点数有一个需要特别注意的点就是浮点数是有误差的,比如以下这段代码你觉得输出的什么结果: public class Demo { public static void m ...

  8. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  9. JAVA中浮点数显示

    //Java小数点后留两位 double num1 =11; double num2 =21; String num3 =""; //函数可以确定十进制数的显示格式:百分数,限定小 ...

随机推荐

  1. iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)

    Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...

  2. listen和accept函数

    listen函数是用来设置监听连接的句柄和队列 当listen函数执行完成以后,服务端就已经可以接受客户端来的新连接了,新连接完成以后listen会把客户端的ip,port和连接句柄放在监听队列里面, ...

  3. 如何在Windows Server 2003中配置FTP站点服务

    前面写过一篇文章<怎样给你的网站注册一个好域名?> ,讲到“玉米”,笔者有很深的情节,也希望与大家交流“米事”,可以站内私信我或者直接回复文章. 有了好域名只是做网站的开始.我们还要买主机 ...

  4. highcharts笔记 highcharts学习 highcharts用法

    标示线:plotLines : 绘制线:

  5. 客户端动态化系列之——Weex

    来源:kuailejim 链接:http://www.jianshu.com/p/ea25fd834944 客户端动态化系列之--URLRoute 在前端越来越火的年代,逐渐衍生出类似React Na ...

  6. [JavaEE] SSH框架笔记_eclipse搭建SSH框架详解

    SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hibe ...

  7. 最近在用placeholder ,是已有的,网上也有不少都是jq写的

    其实除了支持placeholder 的浏览器,其他用js 或jq实现的都不叫placeholder 效果,只能算上是获取焦点,或失去焦点时的一个placeholder 没有出生时就已经存在效果 很多人 ...

  8. JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法

    JS中关闭窗口的方法window.close()在IE上能够正常动作,而在FireFox和Chrome上无法动作. (当时,在Chrome35.0上的时候还是可以的,Chrome36.0上就无法动作了 ...

  9. Oracle基础 存储过程和游标

    一.带游标的存储过程 游标作为参数有两种类型: 1.声明系统游标类型 SYS_REFCURSOR 1)游标作为存储过程的参数: --带游标的存储过程 CREATE OR REPLACE PROCEDU ...

  10. SLR,语法分析表的构建

    太累了,感觉不会再爱了.执行了跟编译原理上的一模一样的例子,输出了正确结果 #include <stdio.h> #include <malloc.h> #include &l ...