c++ - 使用等式比较 float 的情况

标签 c++ floating-point

<分区>

最近我进入了一个关于 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/

相关文章:

linux - Linux内核中浮点的使用

c++ - 当它只有 4 个字节时,float 怎么可能容纳 3.4E38 这样大的数字呢?

c++ - 在类函数中使用对象

c++ - 有人可以用WinSock解释可写和可读fd_sets的功能吗?

c++ - 使用父类函数作为回调订阅主题

php - 检查数据库中是否存在经纬度

c++ - 在 C++ 中流入和流出文本文件

c++ - 为什么同一个对象方法被调用两次?

c++ - 将字节缓冲区 (0-255) 转换为浮点缓冲区 (0.0-1.0)

c++ - 与精确值的 double / float 比较