我有一个字符串,我将其转换为 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/

10-13 03:56