問題タブ [multiprecision]
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.
c - 1 つの long int 変数に 2 つの 32 ビット値を格納することは可能ですか?
2 つの 32 ビット値を 1 つの long int 変数に格納したいと考えています。
Cを使用して32ビットOSでこれを行うにはどうすればよいですか? データを単一の long long 変数に格納することは可能ですか? もしそうなら、それはどのように行われますか?
c - 2^64 より大きい整数値の保存と出力
メルセンヌ素数を見つけるプログラムを作成しようとしています。unsigned long long 型を使用して、(2^61)-1 である 9 番目のメルセンヌ素数の値を特定できました。より大きな値の場合、2^64 より大きい整数値を格納できるデータ型が必要になります。
、、、、など*
の演算子をこのデータ型で*=
使用できるはずです。>
<
%
python - `ast.parse` が数値を int/floats に変換するのを止める方法は?
例えば::
型のノードの元の値を保持しながら、パーサーに Python ソース ファイルを構文ツリーに変換させるにはどうすればよいstr
ですか? たとえば、「1.2」を、精度をまったく失うことなく、できるだけ正確な分数を使用して正確な値に変換する必要があるためです (値 1.2 は浮動小数点形式で正確に表すことはできません)。
できれば、パーサーを再実装せずにこれを行いたいと考えています。ast
おそらく、モジュールよりもこれに適したパーサーが他にあるでしょう。
ところで、式だけでなくプログラムも解析する必要があります。
c++ - C++ での mpfr 変数の動的配列によるメモリ リーク
より大きなプログラムでのメモリの問題を理解しようとするために書かれた多精度ライブラリ MPFR を使用する単純な C++ プログラムがあります。
ここでのポイントは、さまざまなサイズの配列を宣言し、タスク マネージャー (私は Windows を使用しています) でメモリ使用量を監視することです。これはサイズが ~< 200 の場合は問題なく動作しますが、より大きなものを宣言すると、サイズを再度小さくしてもメモリが解放されないようです。
実行例を次に示します。プログラムを開始し、サイズ 50 を選択します。次に、サイズを 50、100、150、200 の間で変更すると、メモリ使用量が期待どおりに上下することがわかります。次に、サイズ 250 を選択すると、メモリ使用量が予想どおりに増加しますが、200 に戻ると減少せず、サイズ 200 と 250 にそれぞれ必要なメモリ値の合計のように増加します。より大きなサイズでも同様の動作が見られます。
何が起こっているのか分かりますか?
assembly - 多重精度符号付き乗算はimul命令で実行できますか?
s0128
符号付き整数型、s0256
、s0512
、s1024
および浮動小数点型f0128
、f0256
、f0512
のすべての従来の演算子と関数を提供する関数ライブラリを作成していますf1024
。
s0128
, s0256
, s0512
,乗算ルーチンを書いてs1024
いますが、間違った結果が得られて混乱しています。命令で符号なしオペランドを使用して同じことを行うことができるのと同じ方法で、64 ビットimul rcx
命令 (で 128 ビットの結果を生成する) で乗算をカスケードできると仮定しましたが、 の答えは間違っています。rdx:rax
mul rcx
imul
imul
これを機能させるには、おそらくミックスとmul
指示など、いくつかのトリックがあると思います。それとも、符号付き乗算命令でより大きな乗算を実装できない理由がありますか?
テクニックを理解したので、s0128
オペランドの最小バージョンについて説明します。
コードが 2 つの 64 ビット値を乗算するたびに、128 ビットの結果が に生成されedx:eax
ます。コードが 128 ビットの結果を生成するたびに、その結果をaddq
, adcq
,adcq
命令で 64 ビット レジスタの累積トリプルに加算します (ここで、最後のadcq
命令はキャリー フラグが伝搬されることを保証するためにゼロを追加するだけです)。
テストとして小さな負の数を小さな正の数で乗算すると、結果は負になりますが、128 ビットの結果の上位 64 ビット値の下部にゼロ以外のビットが 1 つまたは 2 つありますs0128
。これは、多倍精度の符号付き乗算の伝播で何かが正しくないことを意味します。
s0256
もちろん、カスケードは、s0512
、の場合はかなり広範囲ですs1024
。
私は何が欠けていますか?両方のオペランドを符号なしに変換し、符号なし乗算を実行してから、オペランドの一方 (両方ではない) が負の場合、結果を否定する必要がありますか? imul
または、符号付き乗算命令を使用して多倍精度の結果を計算できますか?
c++ - 多倍精度ライブラリ zkcm と sizeof()
多倍精度複素数ライブラリ( zkcm ) を使用しており、 を使用していくつかの結果を比較したいと考えていcomplex<double>
ます。
ある時点で、を使用して変数のメモリを再確認しようとしましたが、変数sizeof()
を割り当てるメモリの大きさに関係なく、同じ答え (32) が得られました。つまり、次のスニペットは、内部で何を使用しても 32 を出力しますzkcm_set_default_prec()
。
sizeof()
変数のメモリサイズを取得する以外の方法はありますか?
c++ - boost::multiprecision::cpp_int: 2 つの正の cpp_int の除算がゼロに向かって切り捨てられることを確認したい
私は を使用していますが、2 つの正の値の除算が に向かって切り捨てられるboost::multiprecision::cpp_int
という確認を見つけることができません。つまり、それcpp_int
0
C++ では、 wasA
およびB
組み込みinteger
型では、標準で に向かって切り捨てる必要が0
あるため、答えはC
equalsになり2
ます。
私はそれが同じように機能すると仮定しcpp_int
ます - 答えは2
にcpp_int
もあります。
しかし、私はこの仮定の確認を見つけることができません。のソース コードも数分間調べましたboost::multiprecision::cpp_int
が、動作を確認するのは簡単ではありませんでした。
boost::multiprecision::cpp_int
2 つの正の整数を除算するときに期待どおりに機能すること、つまり、結果が に向かって切り捨てられることを確認したいと思い0
ます。
ありがとう!
c++ - 128 ビット値を入力する c++ ブースト
int128_t
ブースト、多精度ライブラリで使用します。
私が書いたとき、私int128_t number = 265252859812191058636308480000000;
は間違いを犯しました。その定数は長すぎます。
128 ビット値を正しく入力するにはどうすればよいですか? 例えば:
AF5228967057FE1CB84B92511BE89A47
int128_t?
c++ - boost::multiprecision::cpp_int は POD ですか?
boost::multiprecision::cpp_int
( Boost Multiprecision を参照)を持つクラスをデータ メンバーとして使用するつもりであり、 boost::fast_pool_allocator
Boost カスタム アロケーターを使用してヒープ上でこれらのクラスのインスタンスを管理したいと考えています。
これが安全であるためには、それboost::multiprecision::cpp_int
が POD であることを知る必要があります (または、少なくともヒープ上で割り当てを行わない、つまり、純粋にスタックベースであることを確認する必要があります)。
boost::multiprecision::cpp_int
PODですか?
ありがとう!