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

时间:2021-01-30 07:27:05

标签: c floating-point infinity

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

那么,当数字实际上是 Property 'authorize' does not exist on type 'Reducer<{ authorize: Map<unknown, unknown>; router: RouterState; }, AnyAction>' 时,为什么与 INFINITY 的逻辑等于比较总是返回 true?

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

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

NAN

2 个答案:

答案 0 :(得分:3)

<块引用>

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

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

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

另一个误报是浮点数近似于实数。根据 IEEE 754,除 NaN 之外的每个浮点值代表一个数字,并且它准确地代表该数字。

事实是浮点数字是精确的,而浮点运算近似于实数;正确四舍五入的操作会产生最接近的可表示值(在任何方向或选定方向上最接近,具有各种关系规则)。

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

<块引用>

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

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

当人们不了解数字的值时,他们有时会遇到麻烦。例如,在 float x = 3.3; 中,人们有时没有意识到 C 将 double 3.3 转换为 float,因此 x 不包含与3.3。这是因为转换操作近似于其结果,而不是因为 valuex 不是其特定的指定值。

<块引用>

我尝试了与 NAN 相同的比较,...

NaN 不是数字,因此,在比较相等性时,它永远不会满足“两个操作数表示相同的数字”,因此比较结果为 false。

答案 1 :(得分:2)

<块引用>

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

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

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

同样适用于 -Inf。