2016-10-15 5 views
0

Math.sin() unterschiedliche Genauigkeit zwischen Node.js und C#

Ich habe ein Problem in der Präzision in der letzten Stelle nach dem comma.The JavaScript-Code einen weniger Digit in Vergleich mit dem C# Code erzeugt. Hier

ist der einfache Code Node.js

var seed = 45; 
var x = Math.sin(seed) * 0.5; 
console.log(x);//0.4254517622670592 

Hier ist die einfache C# -Code

public String pseudorandom() 
{ 
    int seed = 45; 
    double num = Math.Sin(seed) * (0.5); 
    return num.ToString("G15");//0.42545176226705922 
} 

Wie die gleiche Präzision erreichen?

+1

Sie vergleichen die Ergebnisse der beiden Sprachen, indem Sie die numerische Form in eine Zeichenfolge konvertieren. Was versuchst du wirklich zu erreichen? Was genau ist Ihr Interesse an "Präzision"? Beide Sprachen verwenden den nativen IEEE 754 Fließkommawert. – Pointy

+0

Ich versuche, die gleiche Präzision zu erreichen. Ich kann Ihre negative Stimme nicht verstehen. – PrOgrAMmer

+0

Ich habe nicht downvote; Ich versuche nur herauszufinden, was du zu tun versuchst. Sie drucken den numerischen Wert aus. In beiden Fällen wird der Wert in eine Zeichenfolge konvertiert, damit er gedruckt werden kann.Es gibt keine Garantie dafür, dass die Regeln beider Sprachen identisch sind. – Pointy

Antwort

2

Der Typ JavaScript Number ist recht komplex. Es sieht so aus, als ob die Fließkommazahl wahrscheinlich IEEE 754-2008 entspricht, aber einige Aspekte bleiben der Implementierung überlassen. Siehe http://www.ecma-international.org/ecma-262/6.0/#sec-number-objects Sek 12.7.

Es gibt eine Notiz

Die Ausgabe von toFixed kann genauer sein als toString für einige Werte, weil toString druckt nur genug signifikante Stellen die Anzahl von benachbarten Zahlenwerten unterscheiden. Zum Beispiel

(1000000000000000128).toString() returns "1000000000000000100", während (1000000000000000128).toFixed(0) returns "1000000000000000128".

Daher volle digit Genauigkeit, die Sie brauchen so etwas wie

seed = 45; 
x = Math.sin(seed) * 0.5; 
x.toFixed(17); 
// on my platform its "0.42545176226705922" 

Beachten Sie auch, die Spezifikation für, wie die Umsetzung von Sinus und Kosinus erlauben etwas Abwechslung in den eigentlichen Algorithmus zu erhalten. Es ist nur garantiert innerhalb +/- 1 ULP.

java Verwendung der Druck Algorithmus ist anders. Selbst erzwingen 17 Ziffern gibt das Ergebnis als 0,42545176226705920.

Sie können überprüfen, ob Sie die gleichen Bitmuster mit x.toString(2) und Double.doubleToLongBits(x) in Java erhalten.

2
return num.ToString("G15");//0.42545176226705922 

gibt tatsächlich „,425451762267059“ (keine signifikante Ziffer + 15 Dezimalstellen in diesem Beispiel), und nicht die Präzision in dem Kommentar gezeigt nach.

So verwenden Sie:

return num.ToString("G16"); 

",4254517622670592"

(für Ihr Beispiel - wo die signifikante Ziffer ist immer 0) zu erhalten G16 16 Dezimalstellen sein.

Verwandte Themen