浮点比较是否连续?如果!(a <= b)是(b> a)保证?

edA*_*a-y 2 floating-point ieee-754

是否保证浮点:

  • (a <= b) 暗示 !(b > a)
  • !(a <= b) 暗示 b > a

我目前正在处理跨语言,但如果需要,你可以假设一个floatdouble一个C,C++或C#.假设没有NaN参与.

我认为IEEE的规则适用于此.我不确定他们的订购规则是否意味着上述内容.

我特别关注的是,a并且b并不总是相同的变量,而是相同的值.它们总是来自完全相同的计算.但是,由于比较是在不同的代码位置完成的,我不能保证它们是否总是存储/截断的形式(最终可能具有扩展的精度).

因为我正在寻找保证,答案应包括提供这些保证的参考,或正式/强烈暗示保证.

Sim*_*rne 6

根据IEEE 754(2008)标准(第5.11节):

四种相互排斥的关系是可能的:小于,等于,大于无序.当至少一个操作数是NaN时,出现最后一种情况.每个NaN都应该将无序与包括其自身在内的所有东西进行比较.比较应忽略零的符号(所以+0 = -0).相同符号的无限操作数应相等.

所以是的,假设两个参数都不是NaN,那么这两个语句都是正确的.

至于隐式扩展精度格式的使用,问题是允许这些意味着它不再严格遵循IEEE 754标准.看到这个关于实现严格合规性的优秀答案和讨论.

更新:根据我的理解,如果你使用的是最近的标准(例如-std=c99),那么你不必担心中间精度,只要你比较的东西是声明变量(例如double a = 0.1; if (a < b) ...)而不是常量(例如if (0.1 < b) ...) .