Java的“Double.MIN_NORMAL”和“Double.MIN_VALUE”之间的区别?
Double.MIN_NORMAL
(在Java 1.6中引入)和Double.MIN_VALUE
有什么区别?
Double.MIN_NORMAL
(在Java 1.6中引入)和Double.MIN_VALUE
有什么区别?
答案可以在 IEEE 浮点表示规范中找到:
对于单一格式,正态数和次正规数之间的区别在于,正常数的有效数(二进制点左侧的位)的前导位为 1,而次正规数的有效数的前导位为 0。单格式次正规数字在IEEE标准754中被称为单格式非正规化数字。
换句话说,是可以表示的最小可能数字,前提是您在二进制点(在十进制系统中称为小数点)前面有一个 1。虽然基本上是没有此约束可以表示的最小数字。Double.MIN_NORMAL
Double.MIN_VALUE
IEEE-754 二进制64 格式:
s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm
(1 ; 3×4−1 =11 秒; 64−3×4 = 52 秒)s
e
m
及其算法:
if and : 解释为 s ×2e−balancer:1023 ×base:1 +m×2−sub-one-pusher:52。(这些是正常数字。e >000_0000_0000
<111_1111_1111
(-1)
(
)
如果 :执行相同的操作(如上面的行所示),除了 是 ,并且是 。(这些是次正规数,除了零,它既不是次正规/正态的。e =000_0000_0000
base:1
base:0
e
e +1
if 和 : 解释为 s ×无穷大。e =111_1111_1111
m =0000...0000
(-1)
如果和:解释为NaN。(顺便说一句:因此NaN有2×252 −1种不同的位表示形式,参见naN#Quiet和doubleToRawLongBits
。e =111_1111_1111
m <>0000...0000
(
)
因此:
其可能的正数中最小的是(Double.MIN_VALUE
(也是。NET的Double.Epsilon
))(一个次正规数)。0_000_0000_0000_0000_..._0001
其可能的正正常数中最小的是(Double.MIN_NORMAL
)。0_000_0000_0001_0000_..._0000
MIN_VALUE
计算:
(-1)s:0 ×2(e:0+1)−平衡器:1023 ×(基数:0 +m:1 ×2−子一推器:52)
= 1 ×2−1022 ×2−52
= 2−1074 (~4.94 × 10−324)
和计算:MIN_NORMAL
(-1)s:0 ×2e:1 −平衡器:1023 ×(基数:1 +m:0 ×2−子一推器:52)
= 1 ×2−1022 ×1
= 2−1022 (~2.225 × 10−308)