C语言 为什么浮点数与无穷大的比较是有效的?



任何有足够知识的人都知道,您不能用简单的逻辑运算符比较两个浮点数并期望得到逻辑结果。

那么,当数字实际上是INFINITY时,为什么对INFINITY进行逻辑上的EQUAL TO比较总是返回true呢?

PS:我尝试了同样的比较NAN,但似乎只有INFINITY可以可靠地检测为等于相同值的另一个数字。

(编辑)这是我的实现(GCC)INFINITYNAN的定义:

#  define INFINITY (__builtin_inff ())
#  define NAN (__builtin_nanf (""))

任何有足够知识的人都知道,您不能用简单的逻辑运算符比较两个浮点数并期望得到逻辑结果。

这在IEEE 754标准或我所知道的任何其他浮点行为规范中没有基础。这是一个很不幸的常见的浮点运算错误。

事实上,相等比较在浮点数中是一个完美的操作:当且仅当两个操作数表示相同的数字时,它产生真值。对于相等的比较永远不会有任何错误。

另一个错误陈述是浮点数近似实数。在IEEE 754中,除了NaN之外的每个浮点值都表示一个数字,并且它精确地表示该数字。

事实上,浮点数当浮点操作时是精确的近似实算术;正确舍入的运算产生最接近的可表示值(在任何方向上最接近或在选定的方向上最接近,有不同的关系规则)。

这个区别对于理解、分析、设计和编写浮点算法的证明是至关重要的。

那么,为什么当数字实际上是无穷大时,逻辑上的EQUAL TO比较总是返回true ?

如上所述,相等性比较当且仅当其操作数表示相同的数字时产生真值。如果x为无穷大,则x == INFINITY返回true。如果x是3,那么x == 3返回true。

当人们不理解数字的含义时,有时会遇到麻烦。例如,在float x = 3.3;中,人们有时没有意识到C将double3.3转换为float,因此x包含的值与3.3不相同。这是因为转换操作近似于它的结果,而不是因为xvalue不是它的特定赋值。

我尝试与NAN进行相同的比较,…

NaN不是一个数字,因此,在相等比较中,它永远不会满足"两个操作数表示相同的数字",因此比较产生false。

不能用简单的逻辑运算符比较两个浮点数并期望得到逻辑结果。

在比较两个浮点数时存在陷阱,因为由于缺乏精度而产生舍入误差,它们可能与您所期望的不完全相同。有时,一个数字非常接近但不完全是我们所期望的。这就是导致问题的原因。

这个问题不适用于+Inf。+Inf不能意外地存储为非常接近+Inf的一些数字。+Inf是一个特定的位模式。它不是INT_MAX;它是处理器本身的一个特殊值。

-Inf也是一样。

最新更新