为什么Float静态比较不需要epsilon值?

时间:2011-08-04 12:08:24

标签: java floating-point comparison epsilon

检查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值 感谢。

2 个答案:

答案 0 :(得分:10)

-0.0negative zero,由IEEE 754 standard指定。

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

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

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

至于你的实际代码,它遇到了很多问题:

  1. 这不是像Float.compare;
  2. 这样的三方比较
  3. 它无法处理NaN s;
  4. 通常最好将epsilon指定为相对值,而不是绝对值,以便它与f1f2一致(请参阅this article进行讨论)。
  5. 我的观点不是要批评你的代码,而是要表明编写好的浮点代码比它最初看起来更难。

答案 1 :(得分:3)

浮点运算很棘手。 This article对基础知识有所启发。

-0是signed zero

  

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