カンマの後の最後の桁の精度に問題があります。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
}
同じ精度を達成する方法は?
JavaScriptの数値タイプは非常に複雑です。浮動小数点数はおそらくIEEE754-2008のように見えますが、いくつかの側面は実装に任されています。http://www.ecma-international.org/ecma-262/6.0/#sec-number-objects sec12.7を参照してください。
メモがあります
toStringは、数値を隣接する数値と区別するのに十分な有効数字しか出力しないため、toFixedの出力は一部の値についてtoStringよりも正確な場合があります。例えば、
(1000000000000000128).toString()
「1000000000000000100」を(1000000000000000128).toFixed(0)
返し、「1000000000000000128」を返します。
したがって、完全な桁の精度を得るには、次のようなものが必要です。
seed = 45;
x = Math.sin(seed) * 0.5;
x.toFixed(17);
// on my platform its "0.42545176226705922"
また、sinとcosの実装により、実際のアルゴリズムにさまざまなバリエーションがどのように考慮されるかについての仕様に注意してください。+/- 1ULP以内でのみ保証されます。
Javaを使用すると、印刷アルゴリズムが異なります。17桁を強制しても、結果は0.42545176226705920になります。
Javaを使用してx.toString(2)
とDouble.doubleToLongBits(x)
で同じビットパターンを取得していることを確認できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加