【发布时间】:2011-08-24 18:08:02
【问题描述】:
#include <stdbool.h>
bool Equality(double a, double b, double epsilon)
{
if (fabs(a-b) < epsilon) return true;
return false;
}
我尝试过这种方法来比较两个双打,但我总是遇到问题,因为我不知道如何选择epsilon,实际上我想比较小数(小数点后的 6 个 6 位),如 0.000001。我尝试了一些数字,有时我得到0.000001 != 0.000001,有时我得到0.000001 == 0.000002
除了与 epsilon 进行比较之外,还有其他方法吗?
我的目的是比较两个双打(在我的情况下代表时间)。以毫秒为单位表示时间的变量 t 是双精度值。它由另一个函数 0.000001 然后 0.000002 等递增。每次 t 变化时,我想检查它是否等于另一个双 tt 类型的变量,以防 tt == t,我有一些指令要执行..
感谢您的帮助
【问题讨论】:
-
“厄普西隆”,而不是厄普塞隆。 en.wikipedia.org/wiki/Epsilon
-
0.000001 和 0.000002 都没有精确的浮点表示,两者都是带有循环小数的无限二进制分数。此外,fabs(a-b) 容易发生灾难性的取消。
-
如果你不知道这到底是怎么一回事,你至少可以通过使用 epsilon 来避免第一个问题,它可以精确地表示为 float,比如 0.00000095367431640625,即 2^-20并接近你想要的 10^-6
-
你为什么首先使用
float?对于其他浮点类型,首选不带 very strong 的double。当然,无论是floats 还是doubles,您的问题仍然存在。
标签: c comparison