替代措辭:何時將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