Java的'Double.MIN_NORMAL`和`Double.MIN_VALUE`之间的区别?

时间:2010-09-16 15:42:19

标签: java ieee-754

Double.MIN_NORMAL(在Java 1.6中引入)和Double.MIN_VALUE之间有什么区别?

3 个答案:

答案 0 :(得分:27)

答案可以在IEEE specification of floating point representation

中找到
  

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

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

答案 1 :(得分:13)

IEEE-754 binary64格式:

s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm

(1 s; 3×4-1 = 11 e s; 64-3×4 = 52 m s)

,及其算法:

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

  • 如果):执行相同操作(如上所述),e =000_0000_0000除外base:1base:0e。 (这些是次正规数,除零以外都不是正常/正常。)

  • 如果e +1e =111_1111_1111:解释为m =0000...0000 s ×无穷大。

  • 如果(-1)e =111_1111_1111:解释为NaN。 (顺便说一下:因此,NaN有两个m <>0000...0000 2 52 -1 (个不同的位表示,cf #Quiet NaN&amp; doubleToRawLongBits。 )

因此:

<小时/>的附录

0_000_0000_0001_0000_..._0000计算:

(-1) s:0 ×2 (e:0 + 1) - 平衡器:1023 ×(基数:0 + m:1×2 -sub酮推杆:52

= 1×2 -1022 ×2 -52

= 2 -1074 ~4.94 × 10−324

MIN_VALUE计算:

( - 1) s:0 ×2 e:1 -balancer:1023 ×(base:1 + m:0×2 -sub-一推杆:52

= 1×2 -1022 ×1

= 2 -1022 ~2.225 × 10−308

答案 2 :(得分:2)

为简单起见,解释只考虑正数。

两个相邻归一化浮点数之间的最大间距&#39; x1&#39;和&#39; x2&#39;是2 * epsilon * x1(归一化的浮点数不是均匀间隔的,它们是对数间隔的)。这意味着,当实数(即&#34;数学&#34;数字)四舍五入为浮点数时,最大相对误差为{{ 1}},这是一个称为机器epsilon或unit roundoff的常量,对于双精度,它的值为2 ^ -52(近似值2.22e-16)。

小于epsilon的浮点数称为次正规数,它们均匀填充0和Double.MIN_NORMAL之间的间隙。这意味着涉及次正规的计算可能导致不太准确的结果。使用次正规使得计算在结果较小时会更慢地失去精度。