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)
您必须注意,截断错误可能会累积.如果两个x
和y
计算值,则必须增加小量.
Eri*_*ert 45
我想确保我有一个可靠的实现平等,大于,小于,小于或等于,大于或等于.
您正在使用二进制浮点运算.
二进制浮点运算用于表示物理量,如长度,质量,电荷,时间等.
据推测,您正在使用二进制浮点运算,因为它打算用于:对物理量进行算术运算.
物理量的测量始终具有特定的精度,具体取决于用于测量它们的设备的精度.
由于您是为您操纵的数量提供值的人,因此您就知道该数量上的"误差条"是什么.例如,如果您提供的数量"建筑物的高度为123.56米",那么您就知道这精确到厘米,而不是千分尺.
因此,当比较两个量是否相等时,所需的语义是"这两个量是否在每个测量指定的误差条内相等?"
所以现在我们回答你的问题.你必须做的是跟踪每个数量的错误; 例如,建筑物的高度"在123.56米的0.01之内",因为您知道测量的精确度.如果您再获得另一个测量值123.5587,并想知道两个测量值是否在误差容差范围内"相等",则进行减法并查看它是否属于误差容限.在这种情况下确实如此.如果测量结果实际上对于微米是精确的,则它们不相等.
简而言之:你是这里唯一知道什么是明智的错误容忍度的人,因为你是唯一一个知道你操纵的数字从何而来的人.根据您用于生产它的设备的精度,使用对您的测量有意义的任何误差容差.
如果你有两个接近1.0的double值,但它们只有它们的最低有效位不同,那么它们之间的差异将比Double.Epsilon大许多个数量级.实际上,差异是324个十进制数量级.这是因为指数部分的影响.Double.Epsilon上有一个巨大的负指数,而1.0的指数为零(当然,除去偏差之后).
如果要比较两个相似的值是否相等,则需要选择适合要比较的值的数量级大小的自定义epsilon值.
如果您要比较的双精度值接近1.0.那么最小重要位的值将接近0.0000000000000001.如果您要比较的双精度值在四元组中,那么最低有效位的值可能高达一千.在这两种情况下,epsilon的单个值都不能用于相等比较.
我只是这样做 - 使用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)
它可用于比较,假设您想要确保两个值完全相等,或者具有 double 类型的最小可表示差异。一般来说,您需要使用大于的数字double.Epsilon
来检查两个双精度数是否近似相等。
为什么 .NET 框架没有定义类似的东西
bool IsApproximatelyEqual(double value, double permittedVariance);
Run Code Online (Sandbox Code Playgroud)
超出了我的范围。
归档时间: |
|
查看次数: |
45085 次 |
最近记录: |