如何在Java或Groovy中找到下一个Double?

如何在Java或Groovy中找到下一个Double?,java,groovy,numbers,double,Java,Groovy,Numbers,Double,当有一个Double d时,我想知道哪个Double’是比d大的最小可能值 当d==0时,我知道答案,即Double.MIN_值: > 0d + Double.MIN_VALUE 4.9E-324 但是所有的ohter数字呢,比如1d > 1d + Double.MIN_VALUE 1.0 我想这与重要的数字有关,但简言之:我正在寻找一种方法,让我获得下一个双精度 nextDouble(0)==4.9E-324 这很容易。正双精度的排序方式与长精度的排序方式相同。因此,将其转换

当有一个Double d时,我想知道哪个Double’是比d大的最小可能值

当d==0时,我知道答案,即Double.MIN_值:

> 0d + Double.MIN_VALUE
4.9E-324
但是所有的ohter数字呢,比如1d

> 1d + Double.MIN_VALUE
1.0
我想这与重要的数字有关,但简言之:我正在寻找一种方法,让我获得下一个双精度

nextDouble(0)==4.9E-324

这很容易。正双精度的排序方式与长精度的排序方式相同。因此,将其转换为long并增加它,然后再返回到double可以实现以下技巧:

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);
}
这相当于我的代码,它对无穷大进行额外检查。

这样做:

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

双倍值的ulp是该浮点值与幅值稍大的双倍值之间的正距离


看看这些函数

返回中与第一个参数相邻的浮点数 第二个论点的方向。如果两个参数比较为 等于返回第二个参数

返回与方向d相邻的浮点值 正无穷大。此方法在语义上等价于
nextAfter(d,Double.正无穷大)但是,下一步
实现的运行速度可能比其等效的nextAfter调用快


虽然很聪明,但这有一个非常糟糕的边界情况。但是,需要一些面具和测试,它会起作用-如果你花点时间来展示这些,1变成+1。我实际上在考虑从尾数到指数的进位,但是在考虑更多之后,它可能真的有效。所以+1。@MartijnCourteaux:你以前的版本更好IMHO@PatriciaShanahan:我想没有。我只是不知道内置的功能。检查我的更新。@AlexanderKosenkov它是用来将-0.0转换成+0.0的。如果不存在,那么-0.0的下一个值将是-Double.MIN_值,而不是Double.MIN_值,因为
d>=0.0d
对于-0.0仍然是正确的。你应该接受你认为正确的答案,这是最好的答案。
Double d = Math.random();
Double next = d + Math.ulp(d);