Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?

Che*_*eng 44 java ieee-754

我可以知道Double.MIN_NORMAL(在1.6中引入)和Double.MIN_VALUE之间的区别是什么?

JavaDoc Double.MIN_NORMAL:

保持类型最小正正常值的常数Double.MIN_VALUE,2 -1022

JavaDoc Double.MIN_NORMAL:

保持最小正非零值类型的常量Double.MIN_VALUE,2 -1074

aio*_*obe 27

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

对于单一格式,正常数和次正规数之间的差异是正常数的有效数的前导位(二进制点的左边的位)是1,而次正规的有效数的前导位是数字为0.单格式次正规数在IEEE标准754中称为单格式非规范化数字.

换句话说,Double.MIN_NORMAL如果在二进制点前面有1(在十进制系统中称为小数点),则可以表示的最小可能数.虽然Double.MIN_VALUE基本上是你可以代表没有这个约束的最小数字.


Pac*_*ier 13

Tldr:

s给出最小的正IEEE-754二进制64 " 正常数 "(也称为归一化数).这相当于2 -1022,大约是2.225×10 -308.

e给出最小的正IEEE-754二进制64" 次正规数 "(也称为非正规数或次正规数).这相当于2 -1074,大约是4.94×10 -324.(这也是.NET提供的数字m.)

TSDR:

要理解为什么这些数字是它们是什么以及它们之间有什么区别,我们必须更深入地了解它们.(另请阅读Bosonix的答案.)

考虑IEEE-754二进制64格式的位表示:

s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm
Run Code Online (Sandbox Code Playgroud)

IEEE-754 binary64值是这样导出的:

  • 如果e >000_0000_0000大于0 小于2047(2047是<111_1111_1111二进制),

    那么值等于(-1)s ×2 e-1023 ×(1 + m×2 -52).(这些是正常数字.)

  • 如果(-1)等于0,

    那么值等于(-1)s ×2 (e + 1)-1023 ×(0 + m×2 -52).(除零之外,这些是次正规数.)

  • 如果(等于2047并且)等于0,

    然后值等于(-1)s × 无穷大.

  • 如果e =000_0000_0000等于2047 base:1而不等于0,

    然后价值等于NaN.(不相关的事实:因此NaN有2×(2 52-1)个不同的比特表示 ;参见base:0.)

因此,最小的正IEEE-754二进制64正常数等于:

         (-1)0 ×2 1-1023 ×(1 + 0×2 -52)

      = 2 -1022

最小的正IEEE-754二进制64次正规数等于:

         (-1)0 ×2 (0 + 1)-1023 ×(0 + 1×2 -52)

      = 2 -1022 ×2 -52

      = 2 -1074