2017-02-22 11 views
0

の精度()で(A/B)の一部の(C/D)番目のルートを計算したい場合があります。たとえば、希望の精度が整数Eの場合、結果はE数字小数点以下根; Eは少なくとも数万に等しいかもしれません; A、B、C、Dは数万の十進数を含む整数です)しかし、私が見つけたすべてのJavascript数学ライブラリは拒否しますそのような数字に対処する。
Decimal.jsを使用しようとしましたが、入力の精度とサイズが制限されています。私は(最後の桁が何らかの形で丸みを帯びていてもよい)1025桁と2の平方根を計算したい場合たとえば、私はDecimal.jsのための次のコードを使用:任意の大きな整数A、B、C、Dに対して任意の精度で(A/B)の(C/D)番目のルートを計算する方法は?

Decimal.set({ precision: 1025 }); 
var r2 = Decimal.pow(2, Decimal.div(1, 2)).toDP(1025).toString(); 
console.log(r2); 

を私は

を取得します
Error: [DecimalError] Precision limit exceeded 

クライアント側(ブラウザで作業中)のJavascriptを使用して問題を解決することは可能ですか?私が知る限り、百万のの桁であっても、根を計算するための効率的なアルゴリズムがいくつかありますが、任意の数と任意精度のJSで実装されているものはありませんでした。まったく可能ですか?

+0

'精度:1025': – Rajesh

+0

-oあなたが計算チェーンに加えて、バッファ内のすべての2つのまたは3の操作が1桁、表示された精度よりも高い内部作業精度を設定することをお勧めしますこれは 'Decimal.set({precision:1029});' – LutzL

+0

@LutzL:私には分かりません.1500桁の2の平方根を得るにはどのようなコードを使うべきですか? Decimal.jsで?さらに、私が理解する限り、Decimal.jsは2^1024以上の整数を扱うことはできません。 –

答えて

0

decimal.jsに設定すると、precision1025には、合計1025(仮数)桁の数字が表示されます。

.toDP(1025)は、小数点以下の桁を指します。この例では、小数点の前に1桁の1があるため、この例では合計1026桁の仮数が必要です。

これらの方法では、適切に増加した内部作業精度を使用して、出力が丸めに対して正しいことが想定されます。これは、より高い精度で再計算された場合、最後の桁が同じではない可能性があることを意味します。これを防ぐには、丸めモードをround-down(ゼロに向かって)に設定します。


電力方法1020より高い精度で失敗した理由は、内部精度は、文字列として与えられた内部LN10一定の長さである1025を超えていることです。エラーは、この状況に対する明示的なテストのためです。

向上した結果を得るために、このライブラリではニュートン法の初期点として1000桁の結果を使用することができます。

my_div = document.getElementById("my_div") 
 
Decimal.set({precision:1010}); 
 
var a = Decimal.pow(new Decimal(2), Decimal.div(1,2)) 
 
my_div.innerHTML += "initial pr=1000 : "+a.toDP(1000); 
 
Decimal.set({precision:2500}); 
 
for(var k=1; k<=4; k++) { 
 
    a = Decimal.div(a.add(Decimal.div(2,a)),2); 
 
    my_div.innerHTML += "<br> Newton "+k+" : "+a; 
 
}
<script src="https://raw.githubusercontent.com/MikeMcl/decimal.js/master/decimal.js"></script> 
 
<div id="my_div"></div>

+0

そして、どのようにDecimalを使うことができますか?sqrt(2)の小数点以下の最初の1500小数点を表示するには?どのような精度を選ぶかは問題ではありませんが、1000桁前後の誤差が出ます。さらに、2^1024以上の数値はどうすれば処理できますか?例えば、 'new Decimal( '0b1 ...')'を1024以上の2進数で使用しようとすると、エラーが発生します。 –

+0

コードに1025桁の "唯一の" LN10定数が含まれているため、power関数(およびおそらくexpとlogも)は約1020を超える精度では使用できません。ニュートンを使って多項式のルーツを修正することができます。最後の編集と例を参照してください。 – LutzL

+0

私が理解する限り、この方法は、力の派生物を知ることに頼っています。私はそれがdecimal.jsを使用して大きな数字に適用できるとは思わない。 –

関連する問題