0

我在将双精度值与诸如“5.5”之类的值进行比较时遇到了麻烦。在我的代码中,我有以下内容:

if (j==5.5f) {
        //do something
    }

当我运行代码并使用 nslog 打印 j 和 5.5fi 的值时,得到完全相同的值。但是,代码没有输入 if 语句。这里有什么问题?

4

3 回答 3

2

1)第一个双精度与浮点数不同,因此对于常量,您应该删除常量中的“f”,因此使用:5.5 而不是 5.5f(常量默认为双精度)

2)因为浮点数没有精确的表示,为了比较它们中的两个,你必须使用一个阈值

因此,将条件替换为:

#include <math.h>

static double threshold = 1e-10
if (fabs(j-5.5) < threshold) { // dont use the f for the literal 
}
于 2013-09-02T16:27:39.557 回答
1

这可能是一个浮点精度问题。一般来说,由于浮点值通常不是精确的表示,因此需要比较一个范围,例如:

if (abs (j - 5.5) < epsilon)
{
    ... do your work....
}

这表示如果jepsilon5.5 以内,则做某事。的值epsilon将取决于应用程序。

于 2013-09-02T16:25:06.427 回答
0

当尝试比较时,浮点数的实现会带来一个非常常见的精度问题,因为它们不是作为普通整数实现的。两个看起来相等的浮点数之间的差异可能非常小,因此您需要定义某种阈值或 epsilon 值,如前所述,在比较两个浮点数时必须使用它们。

永远不要将浮点数或双精度数与“==”等式进行比较,并且始终使用已经显示的阈值或内置函数来达到此目的,无论平台、编译器、语言或其他什么,这是一个非常好的代码实践。(比较字符串也是如此)

于 2013-09-02T16:33:12.543 回答