2016-05-14 108 views
2

我在xUnit中有以下測試用例。Visual Studio 2015更新2使浮點計算更準確?

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更新2有關。然後我嘗試在VS 2012 Update 4中進行相同的測試,第一個測試用例即可。我懷疑VS 2015 update 2的.NET編譯器壞了,或者正在使浮點計算更準確。只要通過VS 2015更新2進行編譯,結果在.NET 4,4.5和4.6.1之間是一致的。我不完全確定這是VS 2015更新2的缺陷,還是一件好事?你有什麼想法嗎?

+1

我懷疑這與運行時有什麼關係,因爲所有表達式都是常量表達式。我建議你看看生成的IL。 –

+0

傾向於明智地只測試您實際可以修復的代碼。你必須點擊[New Issue按鈕](https://github.com/dotnet/roslyn/issues)。 –

+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 
    } 
+0

根據問題中的回答,顯然這是一個新功能,雖然沒有在規範中指定。 – ZZZ

相關問題