Double.MIN_NORMAL
(在Java 1.6中引入)和Double.MIN_VALUE
之间有什么区别?
答案 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:1
,base:0
为e
。 (这些是次正规数,除零以外都不是正常/正常。)
如果e +1
和e =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
。 )
因此:
其可能的最小正数是)
(Double.MIN_VALUE
(也是.NET的Double.Epsilon
))(一个次正规数)。
其可能的正常正数中最小的是0_000_0000_0000_0000_..._0001
(Double.MIN_NORMAL
)。
<小时/>的附录强>
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
之间的间隙。这意味着涉及次正规的计算可能导致不太准确的结果。使用次正规使得计算在结果较小时会更慢地失去精度。