2014-03-28 36 views
4

當有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 

回答

2

這是很容易的方法。積極的雙重是按照長期的方式在比特級上進行排序的。因此,將其轉換爲一個漫長而增加,然後回到雙的伎倆:

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)); 
    } 
} 

這相當於我的代碼,但這額外的檢查無窮大。

+0

TX,我接受在7分鐘:) – Peter

+0

雖然聰明,那有一個非常討厭的邊界情況。然而,一些口罩和測試,它會起作用。如果你花時間來顯示這些,則-1變成+1。 – kdgregory

+0

@kdgregory:完成:) –

5

這樣來做:

Double d = Math.random(); 
Double next = d + Math.ulp(d); 

根據JavaDoc:

double值的ulp是該浮點值與下一個數值較大的double值之間的正距離。

+0

確實不錯,我希望我可以接受兩個答案 – Peter

+2

你應該接受答案**你**認爲是正確的,它最好地回答你的問題。 – Harmlezz

10

看看這些功能。

public static double nextAfter(double start, double direction)

返回鄰近所述第一參數中的浮點數在 第二個參數的方向。如果兩個參數的比較結果均爲 ,則返回第二個參數。

public static double nextUp(double d)

返回相鄰d在 正無窮方向上的浮點值。這種方法在語義上等價於 nextAfter(d, Double.POSITIVE_INFINITY);但是,nextUp的實現可能會比其相應的nextAfter調用運行得更快。

+2

恕我直言:這是最好的答案。 –

相關問題