2016-07-13 6 views
1

Ich habe ein interessantes Problem mit Math.Sqrt in C#. Ich bekomme unterschiedliche Ausgabe in einer Anwendung (an anderer Stelle in der Anwendung) von Math.Sqrt.Andere Ausgabe von Math.Sqrt in C erhalten #

Ich habe großes Projekt und Anwendung haben viel Mathematik Berechnung.

Geschichte

Animations Irrlich DLL ist die Verwendung in der Anwendung Code:

private void Win_Load(object sender, EventArgs e) 
    { 
double myOutput = Math.Sqrt(2.0); //1.4142135623730951 
IrrlichtCreationParameters creationParameter = new IrrlichtCreationParameters(); 
creationParameter.DriverType = IrrlichtLime.Video.DriverType.Direct3D9; 
IrrlichtDevice.CreateDevice(creationParameter); 
myOutput = Math.Sqrt(2.0);//1.4142135381698608 
} 

I zur Ausgabe 1,4142135623730951 jedes Mal möchten.

Jeder hat eine Idee, warum unterschiedliche Ausgabe nach der Verwendung IrrlichtLime.Video.DriverType.Direct3D9?

In welchen Fällen haben wir anders ausgegeben als Math.sqrt?

+0

Können Sie Ihren genauen Code anzeigen? – user3185569

+0

Code doppelt myOutput = Math.Sqrt (2.0); Both place – user2960398

+0

Übergeben Sie 2.0 so hart codiert? oder basierend auf einigen Berechnungen? – user3185569

Antwort

7

Sie inkonsistente Verwendung von Typen haben (obwohl ich sehe Ihren Code nicht), aber hier ist der Beweis:

double v1 = Math.Sqrt(2.0); // 1.4142135623730951 
double v2 = (float)Math.Sqrt(2.0); // 1.4142135381698608 

Sie müssen überall die gleiche Art verwenden und tun kein Casting oder Sie vielleicht verlieren Sie etwas Präzision.

Es scheint, dass Sie eine Menge Berechnungen durchführen, bevor Sie den Wert 2,0 haben (es ist vielleicht ≈ 2,0). Double kann nicht alle Zahlen genau darstellen, wenn Sie Genauigkeit benötigen, müssen Sie Dezimal verwenden.

+0

Ja, Habe den gleichen Ausgang, wenn ich wie doppelt v1 = (float) Math.Sqrt (2.0); Auf der Anmeldeseite double v2 = (float) Math.Sqrt (2.0); nach dem Login-Seite Ausgabe: 1.4142135381698608 Aber ich möchte jedes Mal 1,4142135623730951 ausgeben. Weil ich diese Werte auf pinv (MATHLAB) Funktion verwende (mathlab in C# umwandeln). Wenn ich diesen Wert 1,4142135623730951 verwende, kann ich Mathlab-Algorithmus richtig ausgeben. – user2960398

+0

@ user2960398 Bitte zeigen Sie die Teile Ihres Codes, wo Sie 'Math.Sqrt' verwenden und wie Sie es an MATHLAB übergeben. Bearbeiten Sie Ihre Fragen und zeigen Sie diese Informationen an. – user3185569

+0

Zuerst spiele ich mit Beispielcode wie On Login Seite double myOutput = Math.Sqrt (2.0); //1.4142135623730951 Auf Anwendungsseite double myOutput = Math.Sqrt (2.0); //1.4142135381698608 – user2960398

0

Sie sagen nicht, was das "falsche" Ergebnis ist, aber seien Sie sich bewusst, dass mathematische Operationen wie SQRT immer einen Rundungsfehler haben werden. Das bedeutet, dass Sie Doubles nicht direkt vergleichen sollten, aber sicherstellen sollten, dass sie innerhalb einer Toleranz liegen.

const double delta = 0.00000001d; 
bool same = Math.Abs(d1 - d2) < delta; 

Also, wenn Sie fast die gleiche Antwort bekommen, dann ist dies über das Beste, was Sie von Zahlen mit doppelter Genauigkeit erhalten.

+0

Beide Ergebnisse sind korrekt. Aber ich möchte dieses Ergebnis 1.4142135623730951 (nicht 1.4142135381698608) in meinem Fall nach IrrlichtDevice.CreateDevice (creationParameter); – user2960398