Java中`Double.MIN_NORMAL`和`Double.MIN_VALUE`之间的区别是什么?

53

我写了一个IEEE 754次标准教程,可能会引起您的兴趣:https://dev59.com/nWsy5IYBdhLWcg3wvgr7#53203428 - Ciro Santilli OurBigBook.com
3个回答

34
答案可以在IEEE浮点表示规范中找到:

对于单精度格式,普通数和次正常数之间的区别在于普通数的有效数字(二进制小数点左边的位)的首位为1,而次正常数的有效数字的首位为0。单精度格式的次正常数在 IEEE 标准 754 中被称为单精度格式的非规格化数。

换句话说,只有在二进制小数点前面有数字1的情况下,Double.MIN_NORMAL才是最小可能表示的数字。而Double.MIN_VALUE基本上是没有这个限制的最小可表示数字。

14
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秒)

,以及它的算法:

  • 如果e >000_0000_0000<111_1111_1111:解释为(-1)s ×2e−balancer:1023 ×(base:1 +m×2−sub-one-pusher:52)。(这些是正常数。)

  • 如果e =000_0000_0000:做相同的事情(如上面的行),除了base:1base:0,并且ee +1。(这些是次正常数,除了零既不是次正常/正常数。)

  • 如果e =111_1111_1111m =0000...0000:解释为(-1)s ×无穷大。

  • 如果e =111_1111_1111m <>0000...0000:解释为NaN。(顺便说一句:因此有2×(252−1)不同的位表示形式用于NaN,参见#Quiet NaNdoubleToRawLongBits。)

因此:


附录:

MIN_VALUE计算:

         (-1)s:0 ×2(e:0+1)−balancer:1023 ×(base:0 +m:1 ×2−sub-one-pusher:52)

      = 1 ×2−1022 ×2−52

      = 2−1074 (~4.94 × 10−324)

,以及MIN_NORMAL计算:

         (-1)s:0 ×2e:1 −balancer:1023 ×(base:1 +m:0 ×2−sub-one-pusher:52)

      = 1 ×2−1022 ×1

      = 2−1022 (~2.225 × 10−308)


= 2的-1022次方(2.225 x 10的-308次方)

我认为你想要的是 2^{1 + 52} - 2,这是NaN位模式的数量。 - Mark Dickinson
还有一个小问题:零不是次正常数,所以“这些是次正常数。”这个说法并不完全准确。那么改成“这些是次正常数和零。”如何? - Mark Dickinson
1
好的,当 m == 0 时有两种情况:一种是 s == 0,另一种是 s == 1。换句话说,对于 NaN 的位模式,s2 种可能性,e 只有一种可能性,而 m2^52 - 1 种可能性;相乘得到总共有 2 * (2^52 - 1) = 2^53 - 2 种可能性。 - Mark Dickinson
@MarkDickinson,为什么零不是次正常数?看起来它符合定义:它在二进制点前有一个0,并且指数位都是零。 - aioobe
@aioobe 你看的是哪个定义?IEEE 754的定义部分说:“2.1.51次正常数:在特定格式中,具有小于该格式最小正常数的大小的非零浮点数。[...]”,并且在“正常数”(2.1.38)的定义中也是如此:“在这个标准中,零既不是正常数也不是次正常数。” - Mark Dickinson

3

为简单起见,本说明仅考虑正数。

两个相邻的标准化浮点数 'x1' 和 'x2'之间的最大间距是2 * epsilon * x1(标准化浮点数不是均匀分布的,它们是对数分布)。这意味着,当一个实数(即“数学”数字)舍入为浮点数时,最大的相对误差epsilon,这是一个称为机器ε或单位舍入误差的常数,对于双精度,它的值为2^-52(近似值为2.22e-16)。

小于Double.MIN_NORMAL的浮点数称为子规范数,并且它们填充0和Double.MIN_NORMAL之间的间隙。这意味着涉及子规范数的计算可能导致不太准确的结果。使用子规范数允许计算在结果很小时更慢地失去精度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接