問題タブ [arbitrary-precision]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - BigDecimal 精度爆発
double よりも大きな固定精度で Scala (および/または Java) で計算を実行しようとしています。私は BigDecimals を Scala のデフォルトのMathContextで使用しています。これは精度が 34 です。すべての入力がこの精度を持っていても、数回の計算の後、結果の精度が爆発し始めることがわかりました。
これは、問題を説明していると思われる計算の例です。
結果は 81 で、 より精度が高くなりz40ます。私の場合、setScale を使用したことはありませんが、計算で非常に大きなスケールのゼロが発生しています。
これは私が望む動作ではありません。精度 34が(1 + z40*z40)必要です。これは、計算が実行されている MathContext の精度です ( z40*z401 に比べて無視できるほど小さいため)。どうすればこの種の算数を取得できますか?
更新:この動作は、Scala 2.9.* と 2.10.* の間で MathContext の処理が変更されたためです。(コミットを指摘してくれた Paul Phillips に感謝します。)このディスカッションも参照してください。
c++ - 円周率の桁を計算する
GMPライブラリとC++を使用して、円周率の桁を計算するGauss-Legendreアルゴリズムの実装をコーディングしました。
正しい出力がありますが、コードで精度を指定する必要があるため、どの時点で出力が「悪くなる」かわからないという問題があります。
64ビット精度を使用した出力は次のとおりです。3.141592653589793238* 35 *、最後の2桁が正しくありません。
私の質問は、円周率のn桁が必要な場合、精度bのビット数、およびアルゴリズムの反復回数iが必要になるかどうかです。
ありがとうございました
r - 一部の初期値に対して NaN を生成する関数の最適化
次の目的関数のすべての極小値を見つけたい
'func' は、ロジスティック回帰モデルのフィッシャー情報行列の行列式であり、b1 が [-.3, .3] に、b2 が [6, 8] に属するパラメーター b1 と b2 の関数です。
これら 2 つの初期値を b = c(b1, b2) とします。
初期値の局所最小値in1は次のとおりです。
見られるように、最適化プロセスで終了が発生し、最小値を計算してローカル最適値として返す $massageことができませんでした。optimin1
「in2」の場合もエラーが表示されます。
このエラーは、funcfor in2' isNaN` の値が原因で発生しました:
ただし、in1の目的関数の値は計算されますが、別の初期値の計算を続行できなかっin1たため、最適化は終了します。optim
何が起こったのかを確認するために、det を使用せずに行列として func を定義してみましょう。
我々が得る
したがって、倍精度により、Mat.func(in2)要素の値は になりますInf。私もMat.funcmpfr 関数で書き直します:
したがって:
そのため、精度 55 では、行列要素の値はもうありませInfん。残念ながら、
mpfr関数は目的のクラスを変更し、detr 最適化関数も適用できません。明確にするために、2 つの例を示します。
したがって、mpfr を使用しても問題を解決できませんでした。
すべての極小値を見つけるには、さまざまなランダムな初期値を適用するアルゴリズムを作成する必要があります。しかし、おわかりのように、関数が生成する初期値の一部についてはNaN
(これらの値を無視することはお勧めできません。これは、特に多くの局所最適値を持つ関数の場合、一般にいくつかの局所最小値が失われる可能性があるためです)。
目的関数を回避するために任意の精度で最適化プロセスを実行できるRパッケージがあるかどうか疑問に思っていましたか?NaN
ありがとうございました
c - 任意精度演算用の GCD アルゴリズム
私はこの質問に完全に行き詰まっているので、助けを探しています。
バイナリ GCD やユークリッド GCD などの基本的な GCD 計算アルゴリズムについては、誰もが知っていると思います。このようなメソッドを実装して 2 つの単精度数を計算することは問題ではありません。実際には、それはほんの数ストロークです。
このメソッドを (C 言語で) 多倍精度数 (10^5 ビット以上) 用に実装する必要があります。利用可能な GNU ライブラリ (GNU MP、MPFR、MPIR) がいくつかあり、それらには多倍精度数を定義し、それらに対してアクションを実行する手段があります。これは、「手足」とも呼ばれる単精度部分のカップルとしてメモリに格納された 1 つの多倍精度数のように見えます。
gcd(a, b) を見つけるためにいくつかのメソッドが実装されていますが、実際には、私のニーズに合わせて使用するのは困難です。a と b に正確に 2 つのリムが含まれる場合にのみ使用される GCD 計算のバイナリ メソッド。min(a,b) に 630 以上のリムが含まれる場合などに使用される HGCD メソッド。a と b の任意の長さで使用するためにこれらのメソッドをどのように拡張できるかを理解するのは難しいと思います。また、GNU ライブラリの異なるバージョンには、異なるバージョンと GCD アルゴリズムのメソッドが含まれていることもわかりました。
質問:バイナリ GCD アルゴリズムを「リム」に関して任意の長さの多倍精度整数で動作させることが可能かどうかを調べたいのですが、可能であれば、C でそれを実装する方法やアイデアを得るために.誰かがそれを実装する方法やコード部分を持っていますか?
その問題を解決するためのアドバイスやその他の解決策を検討したいと思います。
誰かが見てみるなら、これは (a = b = 2 limbs) の GNU MP バイナリ GCD メソッドの一部です。
fortran - 数値を任意の高精度で計算する方法は?
ガウス定数 を計算する簡単な fortran プログラムを書きました。
4回の反復後の結果は0.83462684167407308です。とにかく、算術幾何平均法を使用してより良い結果を得るには? 人々は円周率やオイラー定数などの数の桁数をどのように計算するのでしょうか? 各無理数には特定のアルゴリズムがありますか?
c - インラインアセンブリなしで任意精度演算にキャリーロジックを使用するように GCC を取得しますか?
任意精度演算 (512 ビット整数など) を扱う場合、GCC でインライン アセンブリを使用せずに ADC や同様の命令を使用する方法はありますか?
GMP のソースコードを一目見ただけで、サポートされているすべてのプラットフォームのアセンブリが実装されているだけであることがわかります。
これは私が書いたテスト コードで、コマンド ラインから 2 つの 128 ビット数値を加算し、結果を出力します。(mini-gmp の add_n に触発された):
GCC -O3 -std=c99adcによってチェックされるように、命令を生成しませんobjdump。私のgccバージョンはi686-pc-mingw32-gcc (GCC) 4.5.2.
c++ - 小数を整数のべき乗にするときの精度の維持
私のコードは次のとおりです(読みやすくするために簡略化しています。機能が不足していて申し訳ありません):
t>200 のコードを実行するたびに、エネルギー出力の精度が失われます (高べき乗になるため)。任意精度の整数を使用し、GMP ライブラリを取得する必要があると言われました。私はこれを行い、スコープ内の GMP ライブラリを使用してコードを実行することができましたが、何を変更する必要があるのか 実際にはわかりません。
t またはエネルギー (およびエネルギー) または距離または 3 つすべて (/4) を変更しますか?? 何を変更すればよいのかよくわかりませんが、マニュアルから変更方法を読んでいます。
注: 私の元の質問はここにありましたが、それは本当に回答されていると思い、これは新しい質問を保証しました. これが実際に機能する場合、私はそこで答えを受け入れます:大きな整数の精度を失う (pow?)
コードを変更しましたが (以下を参照)、En[b] を初期化するとすぐにセグメンテーション違反 11 が発生します。コメントが私が何をすべきかについてもう少し詳しく説明されていれば、本当に感謝しています。Aさん、今までお世話になりました。
matlab - Matlab: 計算の精度が失われます。変数のスケーリングは可能ですか?
今日、Matlab の精度に関する問題に遭遇しました。
どこ
a =
g =
bB =
Sd =
あなた=
K =
どうやら、異なる次元の変数の計算により、コンピューターの精度に問題が発生します。
Tp =
残念ながら、私はこれを処理する方法を本当に知りません。出力形式をいじってみましたが、これは問題ではありません。ですから、私が得たのは実際には内部の計算精度だと思います。ただし、sqrt(K).*u または u.*Sd を単独で計算すると、適切な値が得られます。3 つの行列すべてを掛け合わせると、異なるはずですが、結果として同じ値が得られます。私はこのスレッドを見つけましたが、任意の値を取得しないため、私の場合は少し異なりますが、何らかの理由ですべて同じです: 補射を計算する際の数値の問題
また、すべての変数を次のようにスケーリングすることも考えました: Sd = Sd/max(Sd) が役立つかもしれませんが、非常に正確で次元的に正しい結果が必要なので、これは役に立ちません。
使用時も
毎回同じ値を取得しますが、桁数が多くなります。どうしてこれなの?
あなたが私を助けてくれることを願っています。乾杯
編集:私の問題をよりよく理解するためのコードの詳細は次のとおりです。