我在将双精度值与诸如“5.5”之类的值进行比较时遇到了麻烦。在我的代码中,我有以下内容:
if (j==5.5f) {
//do something
}
当我运行代码并使用 nslog 打印 j 和 5.5fi 的值时,得到完全相同的值。但是,代码没有输入 if 语句。这里有什么问题?
我在将双精度值与诸如“5.5”之类的值进行比较时遇到了麻烦。在我的代码中,我有以下内容:
if (j==5.5f) {
//do something
}
当我运行代码并使用 nslog 打印 j 和 5.5fi 的值时,得到完全相同的值。但是,代码没有输入 if 语句。这里有什么问题?
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
}
这可能是一个浮点精度问题。一般来说,由于浮点值通常不是精确的表示,因此需要比较一个范围,例如:
if (abs (j - 5.5) < epsilon)
{
... do your work....
}
这表示如果j
在epsilon
5.5 以内,则做某事。的值epsilon
将取决于应用程序。
当尝试比较时,浮点数的实现会带来一个非常常见的精度问题,因为它们不是作为普通整数实现的。两个看起来相等的浮点数之间的差异可能非常小,因此您需要定义某种阈值或 epsilon 值,如前所述,在比较两个浮点数时必须使用它们。
永远不要将浮点数或双精度数与“==”等式进行比较,并且始终使用已经显示的阈值或内置函数来达到此目的,无论平台、编译器、语言或其他什么,这是一个非常好的代码实践。(比较字符串也是如此)