gpt4 book ai didi

java - 最小的 epsilon 使比较结果发生变化

转载 作者:行者123 更新时间:2023-12-04 04:41:51 29 4
gpt4 key购买 nike

什么是最小的浮点值 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

最佳答案

你可以试试Math.nextUp(x)这是文档:

Returns the floating-point value adjacent to f in the direction of positive infinity. This method is semantically equivalent to nextAfter(f, Float.POSITIVE_INFINITY); however, a nextUp implementation may run faster than its equivalent nextAfter call.

Special Cases:

   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

Parameters:

   f - starting floating-point value 

Returns:

   The adjacent floating-point value closer to positive infinity.

关于java - 最小的 epsilon 使比较结果发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18770839/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com