2016-05-14 3 views
2

Ich habe die folgenden Testfälle in xUnit.Visual Studio 2015 Update 2 macht Fließkommaberechnungen genauer?

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

Sie arbeiteten seit Jahren gut über VS 2010, 2012, 2013 und 2015 auf .NET 4 oder 4.5. Die Ergebnisse waren die gleichen wie bei MS Test. Die Testfälle sollen beweisen, dass schwebende Berechnungen möglicherweise nicht präzise genug sind. da erwartet wird, dass 0,1 + 0,2 0,30000000000000004 ist.

Allerdings habe ich heute festgestellt, dass der erste Fall ist gebrochen, offensichtlich die .NET-Laufzeit und Compiler betrachten 0,1f + 0,2f == 0,3f. Ich bin mir nicht sicher, dass das damit zusammenhängt Ich habe vor ein paar Tagen auf VS 2015 Update 2 aufgerüstet. Ich versuche dann die gleichen Tests in VS 2012 Update 4, der erste Testfall ist in Ordnung. Ich würde vermuten, dass der .NET-Compiler von VS 2015 Update 2 defekt ist oder die Fließkommaberechnung genauer macht. Die Ergebnisse sind in .NET 4, 4.5 und 4.6.1 konsistent, solange sie von VS 2015 Update 2 kompiliert werden. Ich bin mir nicht ganz sicher, ob dies ein Fehler von VS 2015 Update 2 ist, oder ist das eine gute Sache? Hast du eine Idee?

+1

Ich bezweifle, dass dies etwas mit der Laufzeit zu tun hat, da alle Ausdrücke konstante Ausdrücke sind. Ich schlage vor, Sie sehen sich die erzeugte IL an. –

+0

Neigt dazu, nur den Code zu testen, den Sie tatsächlich beheben können. Sie müssen auf die Schaltfläche [Neues Problem] (https://github.com/dotnet/roslyn/issues) klicken. –

+0

Warum hätten Sie diese Testfälle? Sie müssen die Sprache nicht selbst testen. –

Antwort

0

Danke Jon, Hans und Hogan. Das ist wahrscheinlich das Problem des Compilers, seit ich vor über 20 Jahren einen Compiler geschrieben habe. Und ich habe das Problem wie vorgeschlagen unter https://github.com/dotnet/roslyn/issues/11311 mit den folgenden Testfällen gemeldet.

[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

Nach den Antworten in der Ausgabe, ist dies offenbar ein neues Feature, obwohl nicht in den Spezifikationen angegeben. – ZZZ

Verwandte Themen