转自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. 0c-34-自动释放池

    #import <Foundation/Foundation.h> #import "Person.h" Person * creatPerson() { Person ...

  2. LINUX 逻辑地址、线性地址、物理地址和虚拟地址 转

    一.概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应.——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地 ...

  3. Cannot instantiate the type HttpClient问题

    看自己动手写爬虫,没想到一上来就跪了. 里面提到用的jar包是apache的http客户端开源项目---HttpClient 就去官网下载了一个版本4.3 当按书上代码敲时 HttpClient ht ...

  4. 解析Qt中QThread使用方法

    本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...

  5. 一款基于jQuery多图切换焦点图插件

    这次要给大家分享的也是一款jQuery图片滑块插件,之前有介绍过不少实用的jQuery焦点图插件和jQuery图片滑块插件,比如jQuery左侧Tab切换的图片滑块插件.它的特点是可以同时切换多张图片 ...

  6. Java微框架:不可忽视的新趋势--转载

    原文:http://www.infoq.com/cn/news/2015/06/Java-Spark-Jodd-Ninja?utm_campaign=infoq_content&utm_sou ...

  7. centos6.4使用man查找命令时,报错No manual entry for xxxx

    前提:安装man的命令 yum -y install man 使用man报错 [root@localhost objs]# man fcntlNo manual entry for fcntl[roo ...

  8. LeetCode14 Longest Common Prefix

    题意: Write a function to find the longest common prefix string amongst an array of strings. (Easy) 这两 ...

  9. 用bootstrapValidator来验证UEditor

    我们的项目使用了bootstrapValidator来作为前端校验,但是表单里面有一个UEditor,它用bootstrapValidator是没有效果的,为了页面风格统一,只好修修改改咯 首先来看一 ...

  10. 【原创】mac 上如何安装及切换输入法

    1. 安装输入法 刚购入mac mini一台,默认只有英文输入法,而自己用习惯了sogou输入法,于是就在网上下载安装了一个sogou拼音输入 for mac. 下载完毕后,在屏幕下方的dock区域右 ...