0

在检查 Float.compare(f1,f2) 后,我发现它比较了 f1f2
并返回 -1,0,1。

如果值为 -0.0、0.0 或 NAN,则返回 -1,0,1。
-0.0 是什么意思?

我本来期望像

 return (Math.abs(f1 - f2) - 0.001f) > 0) 

其中 0.001 是给定的 epsilon 值。
谢谢。

4

2 回答 2

10

-0.0负零,由IEEE 754 标准规定

如果您对如何产生这样的值感到好奇,以下文章可以很好地解释它: http: //www.savrola.com/resources/negative_zero.html

至于不采用 epsilon 值,这就是Float.compare设计工作的方式(这是精确比较,而不是近似比较)。没有什么可以阻止您使用另一个比较函数,该函数确实需要一个 epsilon 并执行近似比较。

浮点数的精确比较和近似比较都有其用途。

至于您的实际代码,它存在许多问题:

  1. 这不是三向比较,例如Float.compare
  2. 它不处理NaNs;
  3. 通常最好将 epsilon 指定为相对值,而不是绝对值,以便它与f1and进行缩放f2(请参阅本文进行讨论)。

我的意思不是批评您的代码,而是表明编写好的浮点代码比看起来更难。

于 2011-08-04T12:10:50.297 回答
3

浮点运算很棘手。本文介绍了一些基础知识。

-0 有符号零

在普通算术中,-0 = +0 = 0。然而,在计算中,一些数字表示允许存在两个零,通常表示为 -0(负零)和 +0(正零)。
[...]
IEEE 754 浮点算术标准(目前由大多数支持浮点数的计算机和编程语言使用)需要 +0 和 -0。零可以被认为是扩展实数线的变体,使得 1/-0 = -∞ 和 1/+0 = +∞,除以零仅在 ±0/±0 和 ±∞/±∞ 时未定义.

于 2011-08-04T12:13:34.290 回答