我的实验表明,-Double.MIN_NORMAL
达到了24的界限,结果为
-2.2250738585072014E-308
...但我无法证明这一点,也没有提出一个结论性的理由,为什么没有其他价值应该超过-MIN_NORMAL
。
答案 0 :(得分:5)
这是一个64位的IEEE-754浮动。
可以存储在52位尾数中的大多数十进制数是17(参见page 4:ceil( 1 + N Log10(2) )
),因此带有小数点和负号的19个字符。
偏差是1023,所以最小的基数2指数是2 ^ -1022,大约是10 ^ -308,所以最长的指数是5个字符,带有'E'和负号。
19 + 5 == 24
答案 1 :(得分:1)
26似乎是一个上限,肯定如下。
根据GrepCode的FloatingDecimal.getChars
版本,OpenJDK7 asserts,值nDigits
最多为19个。查看代码,nDigits
似乎引用到尾数的数字(不是小数点):在上面的例子中,22250738585072014
。其他字符包括
-
标志.
小数点E
-
符号......这使得19 + 7 = 26。
(对于更严格的界限的争论仍然受到欢迎。)
答案 2 :(得分:0)
我认为这个界限是正确的。 javadoc说
m
或a
的小数部分必须打印多少位数?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只需要多少个,更多的数字来唯一地区分参数值和double类型的相邻值。
double
具有隐含的整数部分(1)和52个尾数位。因此,如果double
表示的base-2指数为0,那么x
是范围[1,2]中的double
,那么下一个更高的邻居{{1是} double
+ 2 -52 。 2 -52 约为2.2204 * 10 -16 。这表明将值与下一个相邻值区分开所需的小数位数是16,即与1相邻的双数将表示为x
(15个零)。由于这与实验中的小数位数相匹配,因此它很可能确实是所需的最大数。当然,这不是一个严格的证明;这将需要更多的工作。