<分区>
最近我进入了一个关于 float 比较的讨论。我的观点始终是不要直接使用 ==
比较两个 float 。
有人指出这不是真的,在某些情况下使用 ==
完全没问题。
我可以想到典型的情况,我检查 IEEE 754 文字,如 +-INF
或 +-0
,但除此之外,我想不出这样的情况这不会导致问题。
所以我的问题是:在什么情况下使用 ==
进行浮点比较是有效的?
<分区>
最近我进入了一个关于 float 比较的讨论。我的观点始终是不要直接使用 ==
比较两个 float 。
有人指出这不是真的,在某些情况下使用 ==
完全没问题。
我可以想到典型的情况,我检查 IEEE 754 文字,如 +-INF
或 +-0
,但除此之外,我想不出这样的情况这不会导致问题。
所以我的问题是:在什么情况下使用 ==
进行浮点比较是有效的?
最佳答案
double 浮点表示法(每个数字 64 位)对于最大 -+2**53 (-+ 9,007,199,254,740,992) 的整数是精确的。如果您使用的是 float ,但从整数开始并用它们进行整数计算并且您从未超过该限制,那么结果是准确的并且使用 ==
是完全没问题的。
通常可以精确表示的数字是 N/M,其中 N 是整数,M 是 2 的幂。因此,如果您只是在进行涉及例如的计算1/4、1/2、3/4 和它们的整数倍你也很好,直到你达到非常大的乘数。
当您处理无法精确表示的数字(例如 0.1)时,近似值会导致我得出令人惊讶的结果。问题的一个来源是中间结果可能会以更高的精度存储在临时对象中,因此公式的结果可能会有所不同,具体取决于您是否将其显式存储在内存中,并且它也可能会根据优化级别而变化。
关于c++ - 使用等式比较 float 的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24157018/