我有一个字符串,我将其转换为 double 型,如下所示:
double d = [string doubleValue];
doubleValue
的文档告诉我们,一旦溢出,此方法将返回HUGE_VAL
或-HUGE_VAL
。这是我较早检查的方式:if (d == HUGE_VAL || d == -HUGE_VAL)
//overflow
现在,由于添加了新的“-Weverything”警告标志,因此编译器现在抱怨说
Comparing floating point with == or != is unsafe
我该如何解决这个问题?我应该如何进行这些比较?
关于比较两个“正常”浮点数(即不是“HUGE_VAL”的浮点数),我也有相同的问题。例如,
double a, b;
//...
if (a != b) //this will now yield the same warning
//...
应该如何解决?
最佳答案
您无需担心此警告。在很多情况下,包括您的情况,这都是胡扯。doubleValue
的文档没有说在溢出时它会返回足够接近HUGE_VAL
或-HUGE_VAL
的内容。它说,如果发生溢出,它将恰好返回这些值。
换句话说,在发生溢出的情况下,该方法返回的值会将==
与HUGE_VAL
或-HUGE_VAL
进行比较。
为什么首先出现警告?
考虑示例0.3 + 0.4 == 0.7
。本示例的计算结果为false。人们,包括您遇到的警告的作者,都认为浮点==
是不正确的,并且意外结果是由这种不准确引起的。
他们都是错的。
浮点加法是“不准确的”,从某种意义上讲是不准确的:它返回您请求的操作的最接近的可表示浮点数。在上面的示例中,转换(从十进制到浮点)和浮点加法是导致异常行为的原因。
另一方面,浮点相等性与其他离散类型几乎完全一样。浮点数相等是精确的:除少数异常(exception)情况(NaN值以及+0和-0的情况)外,当且仅当所考虑的两个浮点数具有相同的表示形式时,相等才算为true。
您不需要epsilon即可测试两个浮点值是否相等。并且,作为Dewar says in substance,示例0.3 + 0.4 == 0.7
中的警告应该在+
上,而不是在==
上,以使警告有意义。
最后,在epsilon中进行比较意味着不相等的值将看起来相等,这不适用于所有算法。
关于objective-c - “-Weverything”产生“Comparing floating point with == or != is unsafe”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11421756/