Double.Epsilon表示相等,大于,小于,小于或等于,大于或等于

ss2*_*s2k 52 c# epsilon

http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

如果创建一个自定义算法来确定是否可以将两个浮点数视为相等,则必须使用大于Epsilon常量的值来确定两个值相等的可接受的绝对差值.(通常,差异幅度比Epsilon大很多倍.)

那么这不是真正可以用于比较的ε吗?我真的不明白MSDN的措辞.

它可以在这里的示例中用作epsilon吗?- 浮动和双重比较最有效的方法是什么?

最后这看起来非常重要,所以我想确保我有一个可靠的实现平等,大于,小于,小于或等于,大于或等于.

Han*_*ant 76

我不知道什么时候他们写道,他们吸烟. Double.Epsilon是最小的可表示非非正规浮点值,不是0.你所知道的是,如果存在截断错误,它将始终于此值.更大.

System.Double类型可以表示最多15位数的值.因此,如果double值x等于某个常数,则简单的一阶估计是使用常数*1E-15的epsilon

public static bool AboutEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}
Run Code Online (Sandbox Code Playgroud)

您必须注意,截断错误可能会累积.如果两个xy计算值,则必须增加小量.

  • 微软称`代表最大的正值Double值大于零.请参阅http://msdn.microsoft.com/en-us/library/system.double.epsilon%28v=vs.110%29.aspx. (8认同)
  • Tsk,tsk,有经验的程序员做出类似的陈述,这解释了为什么我们会对这个主题提出这么多问题.基数2!=基数10. (3认同)

Eri*_*ert 45

我想确保我有一个可靠的实现平等,大于,小于,小于或等于,大于或等于.

您正在使用二进制浮点运算.

二进制浮点运算用于表示物理量,如长度,质量,电荷,时间等.

据推测,您正在使用二进制浮点运算,因为它打算用于:对物理量进行算术运算.

物理量的测量始终具有特定的精度,具体取决于用于测量它们的设备的精度.

由于您是为您操纵的数量提供值的人,因此您就知道该数量上的"误差条"是什么.例如,如果您提供的数量"建筑物的高度为123.56米",那么您就知道这精确到厘米,而不是千分尺.

因此,当比较两个量是否相等时,所需的语义是"这两个量是否在每个测量指定的误差条内相等?"

所以现在我们回答你的问题.你必须做的是跟踪每个数量的错误; 例如,建筑物的高度"在123.56米的0.01之内",因为您知道测量的精确度.如果您再获得另一个测量值123.5587,并想知道两个测量值是否在误差容差范围内"相等",则进行减法并查看它是否属于误差容限.在这种情况下确实如此.如果测量结果实际上对于微米是精确的,则它们不相等.

简而言之:你是这里唯一知道什么是明智的错误容忍度的人,因为你是唯一一个知道你操纵的数字从何而来的人.根据您用于生产它的设备的精度,使用对您的测量有意义的任何误差容差.

  • 虽然肯定正确指出容差是一种更实际和直接的定义措施,但我正在研究编码表示的不准确性作为一般的第一遍规则,并且容差将是可选的第二遍,具体取决于具体情况. (2认同)
  • Eric,如果您创建某种数据结构(例如用于游戏)并希望允许其他游戏使用它,那么每个人都会有不同的容忍度,因为他们都使用不同的坐标系。所以,我认为,决定你的 epsilon 是什么,不仅仅是个人条件的问题。 (2认同)
  • 你没有回答这个问题.这不是品味或背景的问题,它与内存中双重的定义有关(IEEE 754). (2认同)

Jef*_*dge 9

如果你有两个接近1.0的double值,但它们只有它们的最低有效位不同,那么它们之间的差异将比Double.Epsilon大许多个数量级.实际上,差异是324个十进制数量级.这是因为指数部分的影响.Double.Epsilon上有一个巨大的负指数,而1.0的指数为零(当然,除去偏差之后).

如果要比较两个相似的值是否相等,则需要选择适合要比较的值的数量级大小的自定义epsilon值.

如果您要比较的双精度值接近1.0.那么最小重要位的值将接近0.0000000000000001.如果您要比较的双精度值在四元组中,那么最低有效位的值可能高达一千.在这两种情况下,epsilon的单个值都不能用于相等比较.


Mat*_*nty 6

我只是这样做 - 使用Kent Bogarts的想法.

private bool IsApproximatelyEqual(double x, double y, double acceptableVariance)
{
     double variance = x > y ? x - y : y - x;
     return variance < acceptableVariance;

     //or
     //return Math.Abs(x - y) < acceptableVariance;
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*art 5

它可用于比较,假设您想要确保两个值完全相等,或者具有 double 类型的最小可表示差异。一般来说,您需要使用大于的数字double.Epsilon来检查两个双精度数是否近似相等。

为什么 .NET 框架没有定义类似的东西

bool IsApproximatelyEqual(double value, double permittedVariance);
Run Code Online (Sandbox Code Playgroud)

超出了我的范围。