當有Double d時,我想知道哪個Double是比d更小的可能值。如何在Java或Groovy中找到下一個Double?
當d == 0我知道答案,那將是Double.MIN_VALUE:
> 0d + Double.MIN_VALUE
4.9E-324
但對於例如像1D所有ohter號碼?
> 1d + Double.MIN_VALUE
1.0
它做機智顯著數字我想,但總之:我正在尋找,讓我的下一個雙
nextDouble(0)==4.9E-324
當有Double d時,我想知道哪個Double是比d更小的可能值。如何在Java或Groovy中找到下一個Double?
當d == 0我知道答案,那將是Double.MIN_VALUE:
> 0d + Double.MIN_VALUE
4.9E-324
但對於例如像1D所有ohter號碼?
> 1d + Double.MIN_VALUE
1.0
它做機智顯著數字我想,但總之:我正在尋找,讓我的下一個雙
nextDouble(0)==4.9E-324
這是很容易的方法。積極的雙重是按照長期的方式在比特級上進行排序的。因此,將其轉換爲一個漫長而增加,然後回到雙的伎倆:
public static double nextDouble(double d)
{
if (d != d) return d;
if (d == Double.MAX_VALUE) return Double.POSITIVE_INFINITY;
if (d == Double.NEGATIVE_INFINITY) return d;
if (d == Double.POSITIVE_INFINITY) return d;
d += 0.0;
int dir = d < 0.0 ? -1 : 1;
return Double.longBitsToDouble(Double.doubleToLongBits(d) + dir);
}
負值同樣的作品。如果你想得到最接近的雙倍,那麼減少長表示。
在應對替代Math.nextUp()
,這裏是source code該方法:
public static double nextUp(double d) {
if(isNaN(d) || d == Double.POSITIVE_INFINITY)
return d;
else {
d += 0.0d;
return Double.longBitsToDouble(Double.doubleToRawLongBits(d) +
((d >= 0.0d)?+1L:-1L));
}
}
這相當於我的代碼,但這額外的檢查無窮大。
看看這些功能。
public static double nextAfter(double start, double direction)
返回鄰近所述第一參數中的浮點數在 第二個參數的方向。如果兩個參數的比較結果均爲 ,則返回第二個參數。
public static double nextUp(double d)
返回相鄰d在 正無窮方向上的浮點值。這種方法在語義上等價於
nextAfter(d, Double.POSITIVE_INFINITY);
但是,nextUp的實現可能會比其相應的nextAfter調用運行得更快。
恕我直言:這是最好的答案。 –
TX,我接受在7分鐘:) – Peter
雖然聰明,那有一個非常討厭的邊界情況。然而,一些口罩和測試,它會起作用。如果你花時間來顯示這些,則-1變成+1。 – kdgregory
@kdgregory:完成:) –