什么是 MS 其他有用的代码片段中的“单位”HasMinimalDifference 用于双重相等

What is "unit" in MS's otherwise useful snippet HasMinimalDifference for double equality

提问人:Dave 提问时间:3/20/2018 最后编辑:fuboDave 更新时间:3/20/2018 访问量:93

问:

Double.Equals 的文档包含一个有用的方法

public static bool HasMinimalDifference(double value1, double value2, int units)
{
    long lValue1 = BitConverter.DoubleToInt64Bits(value1);
    long lValue2 = BitConverter.DoubleToInt64Bits(value2);

    // If the signs are different, return false except for +0 and -0.
    if ((lValue1 >> 63) != (lValue2 >> 63))
    {
        if (value1 == value2)
            return true;

        return false;
    }

    long diff = Math.Abs(lValue1 - lValue2);

    if (diff <= (long)units)
        return true;

    return false;
}

这似乎是测试两个双精度值“相等”的推荐方法。

但是,尽我所能,我无法弄清楚第三个论点的目的,单位。在给出的示例中,传递了值 1,并且没有给出其存在的其他解释。

谁能澄清一下?

C# 双精度 相等

评论

0赞 Filburt 3/20/2018
我认为你的问题的答案就在那里:“两个浮点值的整数表示之间的差异表示了将它们分开的可能浮点值的数量。例如,0.0 和 Epsilon 之间的差值是 1,因为当使用值为零的 Double 时,Epsilon 是最小的可表示值。
0赞 NightOwl888 3/20/2018
有关参数的更多说明,请参阅此答案units
0赞 3/20/2018
我不太确定我是否同意这种方法是否有用。它有一个特殊的例外来处理负零,但这个特殊的例外似乎有点考虑不周:它意味着返回 , 返回 ,即使 .HasMinimalDifference(0.0, 1E-323, 2)trueHasMinimalDifference(-0.0, 1E-323, 200000)false0.0 == -0.0
0赞 Hans Passant 3/20/2018
嗯,这种方法似乎主要是为了让人们摆脱支持电话。这是一个调整参数,从第 16 位开始,一个有效十进制数字中大约有 3 个单位。1 / log10(2) = 3.3 更准确地说,double 充其量有 log10(pow(2, 53)) = 15.9 位有效数字。在这里寻找一些不那么骇人听闻的东西。

答: 暂无答案