Floating point 在IEEE 754中减去不同的数字总是非零?

Floating point 在IEEE 754中减去不同的数字总是非零?,floating-point,ieee-754,Floating Point,Ieee 754,假设a和b是两个相同类型的IEEE-754有限FP数,并且a!=b是真的,它是否总是保持a-b!=0?换句话说,a-b==0对于有限a,b是否意味着a==b?在IEEE-754算法中,对于有限a和b,a==b当且仅当a-b==0。这就是为什么IEEE-754数字系统中包含低于正常值的数字 并非所有语言或语言的实现都符合IEEE-754。即使他们使用IEEE-754格式,也可能不会严格使用IEEE-754运算。a-b==0对于有限a,b意味着可以从IEEE-754标准中的算术规则推导出a==b 由

假设
a
b
是两个相同类型的IEEE-754有限FP数,并且
a!=b
是真的,它是否总是保持
a-b!=0
?换句话说,
a-b==0
对于有限
a
b
是否意味着
a==b

在IEEE-754算法中,对于有限
a
b
a==b
当且仅当
a-b==0
。这就是为什么IEEE-754数字系统中包含低于正常值的数字


并非所有语言或语言的实现都符合IEEE-754。即使他们使用IEEE-754格式,也可能不会严格使用IEEE-754运算。

a-b==0
对于有限
a
b
意味着可以从IEEE-754标准中的算术规则推导出
a==b


由于许多语言的实际实现可能会在某些方面偏离IEEE-754算法,因此在编程中说出您的意思是最安全的。如果您关心两个变量之间的差异,请询问
a-b
。如果您关心它们是否相等,请询问
a==b

我可能是错的,但是AFAIK,不是。减法的结果可能是非规范的,并且AFAIK一些编译器认为非规范为0。阅读FTZ和DAZ:您的问题标记为IEEE-754,没有任何语言或平台特定的标记。如果您想了解特定语言和操作系统的答案,您需要询问有关这些语言和操作系统的问题。为了确保我正确理解这一点:两个正常数字的减法可能会导致次正常值,因此我需要确保在我的机器上启用次正常值/我的编译器依赖于此行为。@MrMobster:是,尽管它可能在大多数机器上启用。确保用零替换低于正常值的硬件“功能”被禁用是不够的。正如答案所述,并非所有语言都符合IEEE-754。例如,C和C++允许实现比浮点表达式更精确地评估浮点表达式。这意味着
Expression1==Expression2
可能会使用额外的位进行计算,从而导致它们不相等,但是,在
a=Expression1;b=表达式2;c=a-b需要实现来消除额外的精度,这可能会导致
c
为零。我的问题的背景是几何计算,其中性能很重要,但也必须是健壮的(正确的)。如果我可以依靠结果的符号来指示方向,我的代码就会变得简单得多,而且最重要的是,它很容易适应SIMD范式。的确,语言通常缺乏浮点障碍。“不要替换此fp表达式”。@MrMobster在这种情况下,我建议为SIMD处理器确定浮点运算规则。如果它完全符合IEEE 754,您就可以了。如果没有,请提出一个新问题,并链接到这些规则。