2016-10-15 9 views
0

Math.sin()Node.jsとCの精度が異なる

カンマの後の最後の桁に問題があります.Javascriptコードは、C#コードと比較して1桁少ない数字を生成します。

は、ここで簡単なNode.jsのコード

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

は同じ精度を達成するためにどのように簡単なC#コード

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

ですか?

+1

数値フォームを文字列に変換する2つの言語の結果を比較しています。あなたは本当に何を達成しようとしていますか? 「正確さ」に興味を持っているのは、正確には何か?どちらの言語もネイティブのIEEE 754浮動小数点を使用します。 – Pointy

+0

私は同じ精度を達成しようとしています。私はあなたの否定的な投票を理解できません。 – PrOgrAMmer

+0

私はdownvoteしませんでした。私はあなたがしようとしていることを理解しようとしています。どちらの場合も、値を文字列に変換して印刷できるように数値を出力しています。両方の言語のルールが同じであるという保証はありません。 – Pointy

答えて

2

JavaScript Numberのタイプはかなり複雑です。浮動小数点数はおそらくIEEE 754-2008のように見えますが、実装にはいくつかの面が残っています。 http://www.ecma-international.org/ecma-262/6.0/#sec-number-objects秒12.7を参照してください。

ノートでのtoStringのみ隣接数値から番号を区別 に十分な有効数字を印刷するためtoFixedの出力は、いくつかの 値についてのtoStringよりも正確であってもよい

あります。例えば、

(1000000000000000128).toString()戻る "1000000000000000100"、一方 (1000000000000000128).toFixed(0)戻る "1000000000000000128"。したがって

あなたは罪とCOSの実装は、実際のアルゴリズムにいくつかのさまざまなを可能にする方法の仕様に注意し、また、

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

ようなものが必要フル桁の精度を取得します。 +/- 1 ULP以内に保証されています。

javaを使用すると、印刷アルゴリズムが異なります。 17桁を強制しても、結果は0.42545176226705920となります。

Javaでx.toString(2)Double.doubleToLongBits(x)を使用して同じビットパターンを取得していることを確認できます。

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

は、実際に(この例では有意な桁+ 15小数点)「0.425451762267059」を返し、および精度は後のコメントには示されていません。

あなたが使用します。

return num.ToString("G16"); 

を(あなたの例のために - 上位桁は常に0である場合)、 "0.4254517622670592"

を取得するためにG16は16の小数点以下の桁数になります。

関連する問題