C++ 关于浮点数关系运算符的否定的断言

C++ 关于浮点数关系运算符的否定的断言,c++,floating-point,floating-point-precision,C++,Floating Point,Floating Point Precision,假设我有两个变量a和b,要么都在typefloat中,要么都在typedouble中,它们都包含一些值。以下断言是否始终成立?我的意思是,数值误差的存在会改变结论吗 当且仅当a=b为false时,a>b为true 如果a==b为真,则a>=b必然为真 通过判断a-b>0是否为真,不执行b。如果我错了,请告诉我 其次,它列出了四个相互排斥的规范关系 可能存在四种相互排斥的关系:小于、等于、大于和无序。最后一种情况是至少有一个操作数为NaN。每一个NaN都会将无序与一切进行比较,包括它自己 然后在表

假设我有两个变量
a
b
,要么都在type
float
中,要么都在type
double
中,它们都包含一些值。以下断言是否始终成立?我的意思是,数值误差的存在会改变结论吗

当且仅当a=b为false时,a>b为true

如果a==b为真,则a>=b必然为真

通过判断
a-b>0
是否为真,不执行b。如果我错了,请告诉我

其次,它列出了四个相互排斥的规范关系

可能存在四种相互排斥的关系:小于、等于、大于和无序。最后一种情况是至少有一个操作数为NaN。每一个NaN都会将无序与一切进行比较,包括它自己

然后在表4中,根据这四个规范关系下的真值定义了各种运算符,如“>”或“>=”。从表中,我们立即得到以下信息:

当且仅当a=b为true

a和b是假的


a>=b和a如果两个数字都不是NaN或无穷大,那么如果您有IEEE兼容的系统,则您的断言成立。如果标准中没有提到这一点,那么我相信这只是因为它足够明显,不值得一提。特别是,如果“aa”没有相同的值(即使对于“南”和“无穷大”),那么我们就进入了疯狂之城

非规范化不应影响结论,因为如果假设IEEE兼容,则非规范化支持是给定的

我能想到的唯一风险是涉及x87 FPU的情况,它是奇怪的80位长双精度格式。从80位长的double到double或float的舍入非常昂贵,因此有时会忽略它,这可能会导致像这样的断言:

assert(sqrt(val) == sqrt(val));
它可能会触发,因为第一个sqrt()调用的结果可能会写入内存,因此四舍五入为float或double。然后将其与第二个sqrt()调用的结果进行比较,该结果可能不会被舍入。但是,严格来说,如果sqrt()返回float或double,则在进行比较之前未能对第二个sqrt()调用的结果进行取整是不符合IEEE的


只有当两个数字都是无穷大时,无穷大才是一个问题。

当您有
NaN
s时,上述断言将失败。我明白了,谢谢。没有nan和inf的情况如何?请参见您添加的限制。我认为唯一的问题可能是非规范化的数字。谢谢大家提供的有用信息。我关注的是使用GPU进行cuda编程,我确实发现他们提到了GPU中的完全非规范数字支持。此外,在提供的链接@pmeerw中,它表示“小于、等于、大于”是相互排斥的。总之,这是否意味着我可以安全地得出结论,至少对于支持非规范数字的硬件而言,我的上述断言是正确的?