替代措辞:何时将Double.MIN_VALUE添加到Java中的双精度型而不是会导致不同的Double值? (请参见下面乔恩斯基特的评论)这两种方法是否对应Java中最小的Double值?
这SO question关于Java的最小Double值有一定的答案,这在我看来是等价的。 Jon Skeet的answer毫无疑问的作品,但他的解释并没有说服我,它是如何从Richard'sanswer不同。
乔恩的答案使用以下:
double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble();
理查兹回答中提到的JavaDoc为Double.MIN_VALUE
的常量保持最小 正非零double类型, 2-1074的值。它等于十六进制 浮点文字 0x0.0000000000001P-1022和也等于 到
Double.longBitsToDouble(0x1L)
。
我的问题是,Double.logBitsToDouble(0x1L)
与Jon的bits++;
有什么不同?
Jon的评论主要关注基本浮点问题。
有添加 Double.MIN_VALUE为双精度值, 和递增代表一个双位模式 之间的差。他们是 完全不同的操作,由于 存储浮点数 的方式。如果您尝试非常 小号码添加到一个非常大的数字, 的差异可能是如此之小 是最接近的结果是一样的 原。将1加到当前 位模式,但是,将总是 改变对应浮动 点值,通过最小可能 值,它是在该比例中可见。
我没有看到Jon的方法增加长“bit ++”,添加Double.MIN_VALUE的方法没有任何区别。他们何时会产生不同的结果?
我写了下面的代码来测试差异。也许有人可以提供更多/更好的样本双数或使用循环来找到有差异的数字。
double d = 3.14159269123456789; // sample double
long bits = Double.doubleToLongBits(d);
long bitsBefore = bits;
bits++;
long bitsAfter = bits;
long bitsDiff = bitsAfter - bitsBefore;
long bitsMinValue = Double.doubleToLongBits(Double.MIN_VALUE);
long bitsSmallValue = Double.doubleToLongBits(Double.longBitsToDouble(0x1L));
if (bitsMinValue == bitsSmallValue)
{
System.out.println("Double.doubleToLongBits(0x1L) is same as Double.doubleToLongBits(Double.MIN_VALUE)");
}
if (bitsDiff == bitsMinValue)
{
System.out.println("bits++ increments the same amount as Double.MIN_VALUE");
}
if (bitsDiff == bitsMinValue)
{
d = d + Double.MIN_VALUE;
System.out.println("Using Double.MIN_VALUE");
}
else
{
d = Double.longBitsToDouble(bits);
System.out.println("Using doubleToLongBits/bits++");
}
System.out.println("bits before: " + bitsBefore);
System.out.println("bits after: " + bitsAfter);
System.out.println("bits diff: " + bitsDiff);
System.out.println("bits Min value: " + bitsMinValue);
System.out.println("bits Small value: " + bitsSmallValue);
OUTPUT:
Double.doubleToLongBits(Double.longBitsToDouble(0x1L)) is same as Double.doubleToLongBits(Double.MIN_VALUE)
bits++ increments the same amount as Double.MIN_VALUE
Using doubleToLongBits/bits++
bits before: 4614256656636814345
bits after: 4614256656636814346
bits diff: 1
bits Min value: 1
bits Small value: 1