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
Java中浮点数能连续精确表示整数的范围的更多相关文章
- java中浮点数的比较(double, float)(转)
问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
Java 中无锁的线程安全整数 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候, 不可避免的会用到synchron ...
- Java 中浮点数---------BigDecimal和double(初探)
为什么要使用 bigdecimal? 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了 ...
- java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)
原码:一个正数,转换为二进制位就是这个正数的原码.负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码. 但是原码有几个缺点,零分两种 +0 和 -0 .很奇怪是吧!还有,在进行不同符号的加法运 ...
- Java中浮点数的精度问题 【转】
当您在计算Money的时候,请看好了!!!要不损失了别后悔!!! 现象1: public static void main(String[] args) { System.out.println(0. ...
- Java中浮点数的坑
基本数据类型 浮点数存在误差 浮点数有一个需要特别注意的点就是浮点数是有误差的,比如以下这段代码你觉得输出的什么结果: public class Demo { public static void m ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- JAVA中浮点数显示
//Java小数点后留两位 double num1 =11; double num2 =21; String num3 =""; //函数可以确定十进制数的显示格式:百分数,限定小 ...
随机推荐
- shell导出和导入redis
1.导出redis #!/bin/bash REDIS_HOST=localhost REDIS_PORT=6379 REDIS_DB=1 KEYNAME=redis:hash:* KEYFILE=k ...
- 关于解决Permission is only granted to system apps
一句话,clean一下这个Project!就OK了…… 不要被假象迷惑!
- Free download SKP900 update tool & activation tool
One of the SKP900 key programmer user failed to get the SKP900 upgraded and add free tokens online u ...
- Callable--创建有返回值的线程
转自:JAVA 笔记 Callable 与 FutureTask:有返回值的多线程 常用的Thread类在run方法执行完之后是没有返回值的,要实现子线程完成任务后返回值给主线程需要借助第三方转存.C ...
- Umbraco文档类型定义多个template
利用这个可以同时写PC端和手机端的网站, 在Template中,建立手机端的模板: 在文档类型中,同时选择两个模板,在浏览的时候在URL后加上Template的名称 + .aspx 就可以浏览到你写的 ...
- ionic 项目的启动屏幕
首先要做好图片,图片的大小最好是192px*192px(icon.png).2208px*2208px(splash.png); 然后在APP项目中建立一个新文件夹,resources,将准备好的两张 ...
- date & dirname
date 年:+%Y 月:+%m 日:+%d 时:+%H 或者 +%k 分:+%M 秒:+%S 周:+%w dirname 目录 获取目录的上级目录
- MongoDB - The mongo Shell, mongo Shell Quick Reference
mongo Shell Command History You can retrieve previous commands issued in the mongo shell with the up ...
- CSS3 照片墙
HTML <body> <h2>照片墙制作</h2> <div class="container"> <img class=& ...
- asp.net的简单分页程序
*.apsx页面 1: <%@ Page Language="C#" Debug ="true" AutoEventWireup="true&q ...