使用==运算符比较两个舍入的浮点数是否正确?
-
04-07-2019 - |
题
或者操作是否有可能失败?
感谢。
我选择了错误的术语,我真正的意思是四舍五入到0,而不是截断。
关键是,我需要比较两个双精度的整数部分,我只是将它们转换为int然后使用==,但是,正如有人在我之前的一个问题中指出的那样,这可能会引发溢出如果double不能适合整数,则为异常。
所以问题是'使用==运算符来比较之前舍入为0的两个双精度是否正确,或者我应该坚持使用cast to int方法并捕获可能的异常?
其他提示
更糟糕的是,有时,即使是完全相同的数字,它也会失败。这是因为某些编译器或处理器将在CPU寄存器中使用比在存储器中更多的精度位(例如,MSVC具有3个不同的浮点行为选项)。因此,最近计算的值可能不会截断这些位并且看起来不相等。永远不要在浮动上使用==。
由于浮点表示的正常问题,它仍然可能失败。不要截断它们,而是使用代表等效精度的delta。
如果您有两个通常认为相同的花车,它可能会失败,
10.19999999
10.20000001
但是当你截断它们时,它们会给出不同的结果。
10.19
10.20
然而,如果我使用0.001的差值来比较差异,我会看到这两个值实际上是相同的。
将 ==
与浮点值一起使用是绝对正确的。
“截断”是什么在浮点背景中意味着什么?您调用了哪些特定的库函数?结果是什么?是什么让你相信“截断”?值是否比非截断值更具可比性?
浮点是十进制值的近似值。浮点只能精确表示两个幂。无论你做什么浮点操作,所有其他值都会出现一些错误。
但是,如果转换为整数,则可以使用 ==
。
如果你的absolut值小于2 ^ 23为单,或者^ ^ 52为double,你可以使用round()然后进行比较。 无法精确存储较大的值,并且在N == N + 1的情况下会打开。