2

最小的浮点值 A 是(x < x + A) == true多少?

我尝试使用 Float.MIN_VALUE 但令人惊讶的是(?[1])它不起作用(除了 0 的值。)

知道 IEEE 754 标准如何存储浮点值,我可以将 1 加到相关浮点数的尾数上,但这个接缝真的很糟糕。我不想将字节数组和位操作放在我的代码中,因为这样一件小事,尤其是在 Java 中。另外,如果我只是将 1 加到 Float.floatToIntBits() 并且尾数全为 1,它会将指数增加 1 并将尾数设置为 0。如果它,我不想实现对这种情况的所有处理没有必要。

是不是有某种函数(希望是内置的)给定浮点 x,它返回最小的浮点 A(x < x + A) == true呢?如果没有,实现它的最干净的方法是什么?

我使用它是因为我如何迭代一行顶点

// return the next vertices strictly at the left of pNewX
float otherLeftX = pOppositeToCurrentCave.leftVertexTo(pNewX);
// we add MIN_VALUE so that the next call to leftVertexTo will return the same vertex returned by leftVertexTo(pNewX)
otherLeftX += Float.MIN_VALUE;
while(otherLeftX >= 0 && pOppositeToCurrentCave.hasLeftVertexTo(otherLeftX)) {
    otherLeftX = pOppositeToCurrentCave.leftVertexTo(otherLeftX);
    //stuff
}

现在由于这个问题,第一个顶点总是被跳过,因为第二次调用leftVertexTo(otherLeftX)不会返回它在第一次调用时返回的相同值

[1] 并不奇怪。在我注意到这个问题后我碰巧意识到,由于浮点数之间的差距是相对的,对于任何数字!= 0 MIN_VALUE 是如此之小以至于它会被截断并且(x = x + FLOAT.MIN_VALUE) == true

4

1 回答 1

3

你可以试试Math.nextUp(x)

这是文档:

返回在正无穷大方向上与 f 相邻的浮点值。这个方法在语义上等价于 nextAfter(f, Float.POSITIVE_INFINITY); 但是,nextUp 实现可能比其等效的 nextAfter 调用运行得更快。

特别案例:

   If the argument is NaN, the result is NaN.
   If the argument is positive infinity, the result is positive infinity.
   If the argument is zero, the result is Float.MIN_VALUE 

参数:

   f - starting floating-point value 

回报:

   The adjacent floating-point value closer to positive infinity.
于 2013-09-12T17:53:16.073 回答