【发布时间】:2013-12-11 21:43:29
【问题描述】:
稍稍阅读后,this article 引起了我的兴趣:
我认为是的,这两个语句是等价的,鉴于 MSDN 的声明:
表示大于零的最小正双值。该字段是常量。
很想知道人们的想法。
编辑:找到一台打开 VS 的计算机并运行此测试。事实证明,是的,正如预期的那样,它们是等价的。
[Test]
public void EpsilonTest()
{
Compare(0d);
Compare(double.Epsilon);
Compare(double.Epsilon * 0.5);
Compare(double.NaN);
Compare(double.PositiveInfinity);
Compare(double.NegativeInfinity);
Compare(double.MaxValue);
Compare(double.MinValue);
}
public void Compare(double x)
{
Assert.AreEqual(Math.Abs(x) == 0d, Math.Abs(x) < double.Epsilon);
}
【问题讨论】:
-
你试过了吗?你的发现是什么?
-
这样比较的目的是什么?这不会帮助您避免舍入错误。 Epsilon 太小了。
-
@Alan:那是相当不完整的。根据您正在使用的实际值的大小,这可能就足够了。当你在数十亿的数量级时,它可能还不够。当您在逗号后面大约 300 个位置时,它可能会。
-
@JeroenVannevel MSDN 引用 - 如果您创建自定义算法来确定两个浮点数是否可以被视为相等,我们不建议您将算法基于 Epsilon 常数的值来建立被认为相等的两个值的可接受的绝对差值。 (通常,差异幅度是 Epsilon 的许多倍。)
-
@Alan:这正是我的观点。如果您以 10^9 的顺序工作,则余量会太大。如果您在 10^-300 中工作就足够了,因为差异实际上接近 Epsilon。