Visual Studio 2015 Update 2使浮点计算更准确?

时间:2016-05-14 12:17:33

标签: c# visual-studio-2015

我在xUnit中有以下测试用例。

Assert.NotEqual(0f, 0.1f + 0.2f - 0.3f);
Assert.NotEqual(0d, 0.1d + 0.2d - 0.3d);
Assert.Equal(0m, 0.1m + 0.2m - 0.3m);

他们在VS 2010,2012年,2013年和2015年的.NET 4或4.5上一直运作良好多年。结果与MS Test相同。测试案例证明浮动计算可能不够精确。因为0.1 + 0.2预计为0.30000000000000004。

然而,今天,我发现第一个案例被打破,显然.NET运行时和编译器考虑0.1f + 0.2f == 0.3f。我不确定这与我几天前升级到VS 2015 Update 2的情况有关。然后我在VS 2012 Update 4中尝试相同的测试,第一个测试用例就可以了。我怀疑VS 2015更新2的.NET编译器被破坏或正在使浮点计算更准确。只要由VS 2015更新2编译,结果在.NET 4,4.5和4.6.1中是一致的。我不完全确定这是VS 2015更新2的错误,还是一件好事?你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

感谢Jon,Hans和Hogan。同意这可能是编译器问题,因为我在20多年前编写了一个编译器。我已根据建议在https://github.com/dotnet/roslyn/issues/11311报告了以下测试用例的问题。

    [TestMethod]
    public void TestFloatConst()
    {
        Assert.AreNotEqual(0f, 0.1f + 0.2f - 0.3f);//Broken in VS 2015 Update 2
    }

    [TestMethod]
    public void TestFloatConstComparison()
    {
        Assert.AreNotEqual(0.3f, 0.1f + 0.2f);//Broken in VS 2015 Update 2
    }

    [TestMethod]
    public void TestDoubleConst()
    {
        Assert.AreNotEqual(0d, 0.1d + 0.2d - 0.3d);
    }

    [TestMethod]
    public void TestDoubleConstComparison()
    {
        Assert.AreNotEqual(0.3d, 0.1d + 0.2d);
    }

    [TestMethod]
    public void TestDecimalConst()
    {
        Assert.AreEqual(0m, 0.1m + 0.2m - 0.3m);
    }

    [TestMethod]
    public void TestFloatVariable()
    {
        var a = 0.1f;
        var b = 0.2f;
        var c = 0.3f;
        Assert.AreNotEqual(0f, a+b-c);//OK in both debug and release builds
    }