【问题标题】:Visual Studio 2015 Update 2 makes floating point calculations more accurate?Visual Studio 2015 Update 2 让浮点计算更准确?
【发布时间】:2016-05-14 12:17:32
【问题描述】:

我在 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);

多年来,它们在 .NET 4 或 4.5 上的 VS 2010、2012、2013 和 2015 年运行良好。结果与 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 update 2 编译,结果在 .NET 4、4.5 和 4.6.1 中是一致的。我不完全确定这是 VS 2015 update 2 的错误,还是一件好事?你有什么想法吗?

【问题讨论】:

  • 我怀疑这与运行时有关,因为所有表达式都是常量表达式。我建议你看看生成的 IL。
  • 明智的做法是只测试您可以实际修复的代码。你必须点击New Issue button
  • 你为什么会有这些测试用例?您不必测试语言本身。
  • @Rolfツ 这显然是他的代码中的一个复杂问题,这是显示问题的最小测试
  • Neil Gafter 和我为 Roslyn 1.2 修复了一些浮点问题。不确定这是否与此处相关。

标签: c# visual-studio-2015


【解决方案1】:

感谢乔恩、汉斯和霍根。同意这可能是编译器问题,因为我在 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
    }

【讨论】:

  • 根据问题中的回复,这显然是一个新功能,但规范中没有指定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2016-07-26
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多