检查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值 感谢。
答案 0 :(得分:10)
-0.0
是negative zero,由IEEE 754 standard指定。
如果您对如何产生这样的价值感到好奇,下面的文章很好地解释了它:http://www.savrola.com/resources/negative_zero.html
至于不采用epsilon值,这就是Float.compare
设计工作的方式(这是一个精确的比较,而不是近似的比较)。没有什么可以阻止你使用另一个比较函数, 采用epsilon并且 执行近似比较。
浮点数的精确和近似比较都有其用途。
至于你的实际代码,它遇到了很多问题:
Float.compare
; NaN
s; f1
和f2
一致(请参阅this article进行讨论)。 我的观点不是要批评你的代码,而是要表明编写好的浮点代码比它最初看起来更难。
答案 1 :(得分:3)
浮点运算很棘手。 This article对基础知识有所启发。
-0是signed zero:
在普通算术中,-0 = + 0 = 0.但是,在计算中,有些 数字表示通常允许存在两个零 用-0(负零)和+0(正零)表示 [...]
用于浮点运算的IEEE 754标准(目前由 大多数支持浮点的计算机和编程语言 数字)需要+0和-0。零可以被认为是 扩展实数行的变体,使得1 / -0 =-∞和1 / + 0 = +∞,除零仅为±0 /±0和±∞/±∞时未定义。