【发布时间】:2011-08-11 03:38:30
【问题描述】:
如果您对WindowsBase.dll > MS.Internal.DoubleUtil.AreClose(...) 进行反思,您将获得以下代码:
public static bool AreClose(double value1, double value2)
{
if (value1 == value2)
{
return true;
}
double num2 = ((Math.Abs(value1) + Math.Abs(value2)) + 10.0) * 2.2204460492503131E-16;
double num = value1 - value2;
return ((-num2 < num) && (num2 > num));
}
我试图理解两个不同的东西:
他们从哪里得出 num2 的公式?我想我只是不明白首先添加
10.0的值然后将所有结果乘以这个数字2.2204460492503131E-16的重要性。有谁知道为什么要用这个公式吗?那里的 return 语句有什么意义?似乎默认情况下,如果 num2 大于 num,则 num2 的取反值应该小于 num。也许我在这里遗漏了一些东西,但这似乎是多余的。对我来说,这就像检查 5 是否大于 3 以及 -5 是否小于 3(例如)。
【问题讨论】:
-
该值被称为Machine Epsilon,它是浮点系统中两个数字之间的最小差值。
-
5大于-7,但-5不小于-7
-
@juharr:现在更有意义了 :)
标签: c# .net compare double internals