你的推理是Double.POSITIVE_INFINITY不应该等于它自己,因为它是“可能”已经获得作为精度的损失的结果。
这一推理适用于所有浮点。作为不准确操作的结果,可以获得任何有限值。这并没有推动IEEE 754标准化委员会将==定义为总是对有限值求值为假,为什么无穷大不同?
如所定义的,==对于理解它所做的事(即,测试已获得的浮点值,而不是通过真实计算获得的值)是有用的。对于任何理解它的人,你需要理解它使用浮点,即使对于不涉及无穷大的计算,Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY求值为true是方便的,如果只测试是否浮点浮点计算的结果为Double.POSITIVE_INFINITY。
这留下了为什么NaN可以承担有特殊行为的问题,无限性应该遵循与有限值相同的一般原则。 NaN不等于无穷大:IEEE 754标准的基本原理是值正好是它们是什么,但是操作的结果可以相对于实际结果近似,并且在这种情况下,得到的浮点值根据舍入模式获得。
忘记1.0 / 0.0被定义为inf的瞬间,这在本讨论中是一个烦恼。请考虑Double.POSITIVE_INFINITY的时刻,仅作为操作结果,例如1.0e100 / 1.0e-300或Double.MAX_VALUE Double.MAX_VALUE。对于这些操作,inf是真实结果的最接近的近似,就像产生有限结果的操作一样。相反,NaN是当操作没有意义时获得的结果。它是可以保护的NaN行为特别,但inf只是所有的值太大的代表的近似。
在现实中,1.0 / 0.0也产生inf,但应该被认为是一个例外。将操作的结果定义为NaN,但将其定义为inf在实现一些算法方面更加方便,这一点也是一致的。在Kahan’s notes中提供了第10页的一个示例。比大多数人希望的更多细节在article “Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing’s Sign Bit”中。我还将解释在IEEE 754中存在与NaN标记分开的“除零”标记,作为用户可能想要的识别特别地,虽然它不被定义为生产NaN,以处理零。