A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 欢欢 高级黑马   /  2014-2-17 20:18  /  1785 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 欢欢 于 2014-2-18 10:40 编辑
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println("Float:");
  6.                 System.out.println(Float.MIN_VALUE);
  7.                 System.out.println(Float.MAX_VALUE);
  8.                 System.out.println("\r\nDouble:");
  9.                 System.out.println(Double.MIN_VALUE);
  10.                 System.out.println(Double.MAX_VALUE);
  11.         }
  12. }
复制代码


这个是怎么得出的?

书上的取值范围是:
数据类型名 数值范围
float ±3.4028347E+38 ~ ±1.40239846E-45
double ±1.79769313486231570E+308
±4.94065645841246544E-324
怎么会出现这种范围呢?


我又查了一本书,是这样的:
类型 最小值 最大值
float -2[sup]-149[/sup] (2-2[sup]-23[/sup])*2[sup]127[/sup]
double 2[sup]-1074[/sup] (2-2[sup]-52[/sup])*2[sup]1023[/sup]

(2-2[sup]-23[/sup])*2[sup]127[/sup] 可以理解为:1.11111111111111111111111*2[sup]111111[/sup]
(注:1.111……和指数1111111均是二进制数)

可是 -2[sup]-149[/sup] 怎么理解呢?

种类
符号位
指数位
尾数位
float
第32位(占1bit)
第31-24位(占8bit)
第23-1位(占23bit)
double
第64位(占1bit)
第63-53位(占11bit)
第52-1位(占52bit)
指数位只有8位啊,而且是有符号数,最大128啊,149是怎么得来的?


评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
等待大神回答
回复 使用道具 举报
谁记这个具体数值啊,正是因为封装了对象所以使用起来调用方法就行,还有不见得有些书写得一定是对的
回复 使用道具 举报
本帖最后由 唐宋元明清 于 2014-2-17 22:24 编辑

float 的取值范围是-(2的32次方)~+(2的32次方-1),因为float是32位进制位所能能表示的全部有符号数值
同理:double的取值范围是-(2的64次方)~+(2的64次方-1),因为double类型是64位二进制所能表示的全部由符号数值。


看了楼下,,想起来以上我说的范围是int和long 的表示范围。。。

float和double 我也不清楚。。。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
首先Float.Min_value Double.Min_value 是可表示的最小正非零值的常量,并不是负数,所以楼主会发现打印的答案没有负号,所谓浮点数就是位数不固定,却是有精度限制的,double比float表示的精度大,所以位数多,打印出来的Float.Min_value=1.4E-45,表示的是1.4乘以10的-45次方,表示为最小值为最小正非零值,书上Float范围中的38在表示最大值的时候就是3.4028347E+38 , 最大精度表示到E+38,不是一个数。我也是看了楼主问题查了资料才懂的。呵呵,共勉!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
平常没太注意这个,不过看楼主的数据与书上写得也差不多,然后帮你搜了下:
float,double 的范围和有效数字怎么算出来的?
首先说一下:
范围是3.4E-38 ——3.4E+38,可提供7位有效数字。
上述这两个量都是近似值,各个编译器不太一样的。

下面我就将标准值是怎么定义的,和你说一下:
这个比较复杂,建议你找一下IEEE754标准看一下。
这个简单说一下吧:
在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位、指数位和尾数位。
这些位的构成如下:
种类-------符号位-------------指数位----------------尾数位----
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)

取值范围主要看指数部分:
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。

由于float的指数部分对应的指数范围为-128~128,所以取值范围为:
-2^128到2^128,约等于-3.4E38 — +3.4E38

精度(有效数字)主要看尾数位:
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位
float 为4个字节,表示为:一个符号位,8个指数位,23个尾数,所以有效位数由尾数来决定,即2^23=8388608为7位,指数的范围是2^(-127~127)
double为8个字节:表示为:一个符号位,11个指数位,52个尾数来表示,所以有效位数为
2^52=4503599627370496为15位,指数的范围为2^12-1=4095(-2047~2047)

希望能帮到你

点评

这些我都知道,你没有仔细看问题吧!  发表于 2014-2-18 08:29

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
欢欢 高级黑马 2014-2-18 08:33:17
7#
徐青松 发表于 2014-2-17 22:11
首先Float.Min_value Double.Min_value 是可表示的最小正非零值的常量,并不是负数,所以楼主会发现打印的 ...

你看的是什么资料呢?能说明为什么两个数值不一样吗?我想仔细研究研究
回复 使用道具 举报
欢欢 高级黑马 2014-2-18 10:00:08
8#
徐青松 发表于 2014-2-17 22:11
首先Float.Min_value Double.Min_value 是可表示的最小正非零值的常量,并不是负数,所以楼主会发现打印的 ...

2[sup]128[/sup]=3.4028347E+38 ,
那么,±1.40239846E-45 是怎么得来的?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马