C# 将浮点值和双精度值与增量进行比较?

C# 将浮点值和双精度值与增量进行比较?,c#,.net,floating-point,C#,.net,Floating Point,据我所知,必须仔细比较浮点类型的值,以避免固有的浮点错误问题。这可以通过将值与错误阈值进行比较来改进 例如,以下解决方案比简单的x==y测试更有用: static float CompareRelativeError(float x, float y) { return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)); } static bool CompareAlmostEqual(float x, float y, float

据我所知,必须仔细比较浮点类型的值,以避免固有的浮点错误问题。这可以通过将值与错误阈值进行比较来改进

例如,以下解决方案比简单的
x==y
测试更有用:

static float CompareRelativeError(float x, float y) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y));
}
static bool CompareAlmostEqual(float x, float y, float delta) {
    return x == y || CompareRelativeError(x, y) < delta;
}

// apologies if this is a poor example
if (CompareAlmostEqual(1f/10f, 0.1f)) { ... }
因此,以下内容对于
x>=y
有效:

static bool CompareGreaterOrEqual(float x, float y) {
    return x >= y;
}

我的假设正确吗?

既然我们已经同意,在这种情况下,操作符
=
是通过
CompareAlmostEqual
完成的,那么在
compareAgreaterequal
中使用它也是有意义的

static bool CompareGreaterOrEqual(float x, float y, float delta) {
    return x >= y || CompareAlmostEqual(x, y, delta);
}

另外,虽然这在很大程度上取决于如何使用这些函数,但我还将使
delta
成为一个常量变量,在整个类中使用,以确保使用相同的值(而不是将其作为参数传递)。

等式测试正是delta(或epsilon)的原因该技术用于浮点值

e、 我们希望3等于2.999999。。。精确地说

因此,当定义为以下内容时,您的
compareAgreaterEqual
方法是不够的:

static bool CompareGreaterOrEqual(float x, float y) {
    return x >= y;
}
应该是:

static bool CompareGreaterOrEqual(float x, float y, float delta) {
    return x >= y || CompareAlmostEqual(x, y, delta);
}
注意:
x>=y
在第一次测试中可以是
x>y
,因为增量比较考虑了相等性:

static bool CompareGreaterOrEqual(float x, float y, float delta) {
    return x > y || CompareAlmostEqual(x, y, delta);
}

可能是@MitchWheat的复制品-事实上,看看我们答案下面的时间,我相信你是胜利者,先生!非常感谢你们的帮助!这是一个非常好的书面回答,我现在明白了为什么这里也需要
CompareAlmostEqual
static bool CompareGreaterOrEqual(float x, float y, float delta) {
    return x > y || CompareAlmostEqual(x, y, delta);
}