浮点不等式保证是一致的吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

假设a,,,b,,,c,和d宣布double(或float)。下面的表达式总是正确的吗?

! ( (a >= b) && (c <= d) ) || ( (a-c) >= (b-d) )

! ( (a >  b) && (c <= d) ) || ( (a-c) >  (b-d) )

! ( (a >= b) && (c <  d) ) || ( (a-c) >  (b-d) )

是否有来自IEEE 754或当前C或C++标准的任何保证?在编译时,任何编译器都会将其优化为true吗?

提问于
用户回答回答于

Serge Rogatch给出了你的第二和第三个表达式的反例。

第一个,!(a >= b && c <= d) || a-c >= b-d,则在IEEE 754算法中,如果a,,,b,,,c,和d一定都是有限的。有限数的减法不能产生一个NaN...。因此反例必须满足a >= b && c <= d && a-c < b-d...。然而,a >= b意味着a-c >= b-c,不管是什么c是,而且c <= d意味着b-c >= b-d,不管是什么b是。传递性>=照顾好剩下的人。

你可以a = c = 1.0/0.0任意选择bd如果您放宽了以下条件a,,,b,,,c,和d一定都是有限的。所有反例基本上都是这种形式。

用户回答回答于

对于第三种产生假的方法,只要取大等号就足够了。ab和小的不平等cd,G.a=1e30, b=1e30, c=1e-31, d=1e-30...

编辑:好的,对于第二个产生错误,类比于第三个,应该足够采取小不等。ab大而平等cd,G.a=1e-30, b=1e-31, c=1e30, d = 1e30...

不知道第一个表达式的反例..。

扫码关注云+社区