c# - 将 float 和 double 值与 delta 进行比较?

标签 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 delta) {
    return x == y || CompareRelativeError(x, y) < delta;
}

// apologies if this is a poor example
if (CompareAlmostEqual(1f/10f, 0.1f)) { ... }

上述解决方案源自以下资源: Is it safe when compare 2 float/double directly in Java?

虽然我无法找到任何文献来证实这一点,但对我来说,这似乎同样适用于像 x > y 这样的比较。例如,如果 xy 本质上相等,那么一个怎么会比另一个大...

static bool CompareGreater(float x, float y, float delta) {
    return x > y && !CompareAlmostEqual(x, y, delta);
}

因此以下内容对 x >= y 有效:

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

我的假设是否正确?

最佳答案

相等性测试正是将 delta(或 epsilon)技术用于浮点值的原因。

例如我们希望 3 等于 2.999999... 达到一定的精度。

所以你的 CompareGreaterOrEqual 方法在定义为:

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);
}

关于c# - 将 float 和 double 值与 delta 进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844659/

相关文章:

c# - 获取当前用户 SID 的最佳方法是什么?

.net - 如何从Mac卸载.NET Core 1.0.0?

.net - 使用 HttpWebRequest/Invoke-WebRequest 请求的最长时间?

javascript - 两个 float 相除的安全方法?

C 浮点文字 - 在 EBNF 中定义

java - 如何在 Java 中将 IEEE-754 二进制表示字符串转换为 float 或 double ?

c# - 将 .Net 4.5.1 中的 KeyDerivation.Pbkdf2 转换为 .Net 4.0

c# - 为什么我在类属性上得到这个 "infinite loop"?

c# - 在我的终结器中处理我的 System.IDisposable 对象

c# - 从 UWP 调用的 PCL 汇编代码中的 MissingManifestResourceException