Java的“Double.MIN_NORMAL”和“Double.MIN_VALUE”之间的区别?

2022-08-31 19:58:58

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


答案 1

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

对于单一格式,正态数和次正规数之间的区别在于,正常数的有效数(二进制点左侧的位)的前导位为 1,而次正规数的有效数的前导位为 0。单格式次正规数字在IEEE标准754中被称为单格式非正规化数字。

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


答案 2

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

及其算法:

  • 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_0000base:1base:0ee +1

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

  • 如果和:解释为NaN。(顺便说一句:因此NaN有2×252 −1种不同的位表示形式,参见naN#QuietdoubleToRawLongBitse =111_1111_1111m <>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)


推荐