java浮点值什么意思_Java浮点类型、取值集合及浮点值

----转自《Java虚拟机规范_JavaSE》

浮点类型包含float类型和double类型两种,它们在概念上与《IEEE Standard for Binary

Floating-Point Arithmetic》ANSI/IEEE Std. 754-1985(IEEE, New

York)标准中定义的32位单精度和64位双精度IEEE 754格式取值和操作都是一致的。

IEEE 754标准的内容不仅包括了正负带符号可数的数值(Sign-Magnitude

Numbers),还包括了正负零、正负无穷大和一个特殊的“非数字”标识(Not-a-Number,下文用NaN表示)。NaN值用于表示某些无效的运算操作,例如除数为零等情况。

所有Java虚拟机的实现都必须支持两种标准的浮点数值集合:单精度浮点数集合和双精度浮点数集合。另外,Java虚拟机实现可以自由选择是否要支持单精度扩展指数集合和双精度扩展指数集合,也可以选择支持其中的一种或全部。这些扩展指数集合可能在某些特定情况下代替标准浮点数集合来表示float和double类型的数值。

对于一个非零的、可数的任意浮点值,都可以表示为s×m×2^(e-N+1)的形式,其中s可以是+1或者-1,m是一个小于2^N的正整数,e是一个介于Emin=-(2^(K-1)-2)和Emax=2^(K-1)-1之间的整数(包括Emin和Emax)。这里的N和K两个参数的取值范围决定于当前采用的浮点数值集合。部分浮点数使用这种规则得到的表示形式可能不是唯一的,例如在指定的数值集合内,可以存在一个数字v,它能找到特定的s、m和e值来表示,使得其中m是偶数,并且e小于2^(K-1),这样我们就能够通过把m的值减半再将e的值增加1来的方式得到v的另外一种不同的表示形式。在这些表示形式中,如果其中某种表示形式中m的值满足条件m≥2^(N-1)的话,那就称这种表示为标准表示(Normalized

Representation),不满足这个条件的其他表示形式就称为非标准表示(Denormalized

Representation)。如果某个数值不存在任何满足m≥2^(N-1)的表示形式,即不存在任何标准表示,那就称这个数字为非标准值(Denormalized

Value)。

在两个必须支持的浮点数值集合和两个可选的浮点数值集合内,对参数N和K(也包括衍生参数Emin和Emax)的约束如表2-1所示。

a4c26d1e5885305701be709a3d33442f.png

如果虚拟机实现支持了(无论是支持一种还是支持全部)扩展指数集合,那每一种被支持的扩展指数集合都有一个由具体虚拟机实现决定的参数K,表2-1给出了这个参数的约束范围(≥11和≥15),这个参数也决定了Emin和Emax两个衍生参数的取值范围。

上述四种数值集合都不仅包含可数的非零值,还包括五个特殊的数值:正数零、负数零、正无穷大、负无穷大和NaN。

有一点需要注意的是,表2-1中的约束是经过精心设计,可以保证每一个单精度浮点数集合中的元素都一定是单精度扩展指数集合、双精度浮点数集合和双精度扩展指数集合中的元素。与此类似,每一个双精度浮点数集合中的元素,都一定是双精度扩展指数集合的元素。换句话说,每一种扩展指数集合都有比相应的标准浮点数集合更大的指数取值范围,但是不会有更高的精度。

每一个单精度浮点数集合中的元素,都可以精确地使用IEEE

754标准中定义的单精度浮点格式表示出来,只有NaN一个例外。类似的,每一个双精度浮点数集合中的元素,都可以精确地使用IEEE

754标准中定义的双精度浮点格式表示出来,也只有NaN一个例外。不过请读者注意,在这里定义的单精度扩展指数集合和双精度扩展指数集合中的元素和IEEE

754标准里面单精度扩展和双精度扩展格式的表示并不完全一致。不过除了Class文件格式中必要的浮点数表示描述以外,本规范并不特别要求表示浮点数值表示形式。

上面提到的单精度浮点数集合、单精度扩展指数集合、双精度浮点数集合和双精度扩展指数集合都并不是具体的数据类型。虚拟机实现使用一个单精度浮点数集合的元素来表示一个float类型的数值在所有场景中都是可行的,但是在某些特定的上下文环境中,也允许虚拟机实现使用单精度扩展指数集合的元素来代替。类似的,虚拟机实现使用一个双精度浮点数集合的元素来表示一个double类型的数值在所有场景中都是可行的,但是在某些特定的上下文环境中,也允许虚拟机实现使用双精度扩展指数集合的元素来代替。

除了NaN以外,浮点数集合中的所有元素都是有序的。如果把它们从小到大按顺序排列好,那顺序将会是:负无穷,可数负数、正负零、可数正数、正无穷。

浮点数中,正数零和负数零是相等的,但是它们有一些操作会有区别。例如1.0除以0.0会产生正无穷大的结果,而1.0除以-0.0则会产生负无穷大的结果。

NaN是无序的,对它进行任何的数值比较和等值测试都会返回false的比较结果。值得一提的是,有且只有NaN一个数与自身比较是否数值上相等时会得到false的比较结果,任何数字与NaN进行非等值比较都会返回true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值