Mat*_*asB 2 c++ floating-point
最近我开始讨论浮点比较.我的观点总是不==
直接比较两个浮点数.
有人指出,事实并非如此,有些情况下使用==
完全没问题.我可以想到典型的情况,我在其中检查IEEE 754文字,+-INF
或者+-0
,除此之外,我不能想到这不会导致问题的情况.
所以我的问题是:使用浮点比较时有哪些情况==
?
双精度浮点表示(每个数字64位)对于整数最高为+ + 2**53( - + 9,007,199,254,740,992).如果您使用的是浮点数,但是从整数开始并使用它们进行整数计算,并且您从未超过该限制,则结果是精确的并且使用==
完全正常.
通常可以精确表示的数字是N/M,其中N是整数,M是2的幂.因此,如果您只是进行涉及例如1/4,1/2,3/4和它们的整数倍的计算,那么您也可以使用,直到达到非常大的乘数.
相反,当你处理无法准确表示的数字(例如0.1)时,近似值会导致我产生令人惊讶的结果.问题的一个原因是中间结果可能以更高的精度存储在临时值中,因此公式的结果可能会有所不同,具体取决于您是否明确地将其存储在内存中,并且它也可能根据优化级别而改变.