問題タブ [bigint]
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.
mysql - 非常に大きな自動インクリメント ID が必要な場合はどうすればよいですか?
MySQL の Web サイトによると、signed bigint は 18446744073709551615 まで可能です。自動インクリメントの主キーにそれより大きな数値が必要な場合はどうすればよいですか?
postgresql - pg_size_pretty が負の値を返すのはなぜですか?
私は pg_size_pretty() で遊んでいましたが、大きな値を渡すと負の値を返し始めることがわかりました。これは私のテストです:
理由を説明していただけますか?ありがとう。
sql - Convert nvarchar to bigint in Sql server 2008
I want insert all rows of a table into another table, and I also want convert a nvarchar
field into bigint
, but when I use convert(bigint, col1)
SQL Server shows an error:
Error converting data type nvarchar to bigint
How can I fix this problem?
ruby-on-rails - rails3 bigint 主キー
Rails 3 で型付きの主キー フィールドbigint
(またはstring
そうでないもの)を作成したいと思います。int
たとえば、次のような特定のデータ構造があります。
私が現在プッシュしようとしているアプローチ:
列の型は正しくなりますが、主キー オプションは sqlite3 には存在しません。これは MySQL にも当てはまると思います。
db2 - bigInt データ型を含む db2 の最初のバージョン
BigInt データ型を含む db2 の最初のバージョンは何ですか?
バージョン 8 だと思っていましたが、公式の IBM ソースを探しています。私はグーグルであまり運がありませんでした。
mysql - MySQL での BIGINT シフト
やあ、これはバグかもしれないと思うが、それは私を殺している. Ubuntu Linux サーバーで MySQL 5.1.41 を使用しています。ランダムな符号付き BIGINT 値を作成する関数を作成しようとしています。RAND() の精度は小さすぎて可能な BIGINT 値の全範囲を生成できないため、ビット演算子を使用して 4 つの 32 ビット ワードを結合することにしました。
MySQL Workbench を起動し、次のことを試して、ビット シフト演算子が負の数で正しく機能するかどうかを確認しました。
0x1ACE - 0x8000 は -25906 なので、16 ビットを左にシフトすると、65536 を乗算する必要がありますよね? 返された答えは 0xFFFFFFFF9ACE0000 で、これは -1697775616 または -25906 * 65536 の符号付き表現です。
そこで私の計画は、それを使用してランダムな符号付き BIGINT の最初の 32 ビット ワードを生成し、単純なループを使用して値にさらに 32 ビット ワードを 3 つ追加し、一度に 4 バイト以上ビットをシフトすることでした。興奮して、最初に次のコードを関数に入れ、ハードコードされた値を使用して計画をテストしました。
シフトされる値が正になるように値を設定すると、すべて正常に動作します。ただし、シフトされた負の値 (この場合は -25906) を使用してこの計算を実行した後、x が 0x7FFFFFFFFFFFFFFF であることがわかりました。これは、符号付き 64 ビット整数の正の最大値です。私は完全に困惑しています。まったく同じ操作が、関数内の SET 操作であるか、SELECT ステートメントであるかによって、まったく異なる結果を生成しています。
そのため、x が署名されているか署名されていないかをいじり始めたところ、事態は非常に奇妙になりました。x unsigned を作ってみて、次のことを試しました:
私がそれをしたとき、私はゼロに等しい x を得ました。x は符号なしであり、結果は負であるため、驚くことではありません。しかし、ひばりで、私はこれを試しました:
驚いたことに、x は 0xFFFFFFFFFFFF9ACE に設定されていました。
誰か助けてくれませんか?私はランダムな符号付き BIGINT を効率的に生成するだけの関数に何時間も取り組んできました。私は疲れています。このようなものを見れば見るほど、イライラが増し、理解できなくなります。 . ここで何が起こっているのかを説明したり、この関数を記述して現在一貫して機能するようにアドバイスしたり、これがバグである場合は修正された場合は後のバージョンでサポートしたりしていただければ幸いです。
algorithm - 10^x から 2^x への大整数基数/基数変換
序文
私は自分の BigInt ライブラリを作成して改良することで、コンピューター数学について学んでいます。これまでのところ、私の最初の化身は、10 進数のすべての数字をベクトルの連続する要素に格納しています。任意の精度で乗算および加算できます。基数 2^x に変換することにより、標準 C++ データ型で使用できるすべてのスペースを使用して、速度を上げたいと考えています。
情報
基数 10 の stdin から 1000 桁以上の数字を読み取っていますが、それらを基数 2^x に変換したいので、標準 C++ データ型のいずれか (unsigned int など) の配列またはベクトルに簡単に格納できます。基数変換、剰余法による繰り返し除算を行う方法について、私は1つのアイデアしか持っていません。そのメソッドを説明する C++ コードを次に示します。
難問
私が迷っていることのいくつかは、剰余による除算が大きな整数で基数変換を行う適切な方法であるかどうかです。GMPライブラリがどのようにそれを行うかを見てみました。gmp/mpn/generic/set_str.cは、「魔法」が発生する関連する c ソース ファイルですが、そこで何が起こっているのかはわかりません。Matt McCutchen のBigIntは、剰余法による除算の繰り返しを使用しているようです。この方法を使用する場合、基本的に BigInt クラスの 2 つのバージョンを作成する必要があります。
結論
- 膨大な数を文字列から 32 ビット ワードの配列に変換する適切な手順についてアドバイスを提供してください。
- GMP が文字列を 32 ビット ワードの配列に変換する方法を、抽象化の多くのレイヤーを経由せずに学習するのを手伝ってください。
例 4 ビット ワード サイズの使用
保存したい番号 (明らかに小さいサイズで): 123456789
符号なし文字の範囲は 0 ~ 255 です。数値を分割してベクトルに格納する場合は、次の 3 つの方法のいずれかを実行できます。
- 底が 10 であるため、ベクトルは [1,2,3,4,5,6,7,8,9] のようになります。
- これは、私の最初の実装での私のベクトルの外観です。
- 基数 100 として、ベクトルは [1,23,45,67,89] のようになります。
- 基数 10 から基数 100 への変換が簡単で、ciel (基数 10/2 の数字) 要素があります。
- 基数 256 として、ベクトルは [7,91,205,21] のようになります。
明らかに、3 番目のソリューションが内部表現に最適であり、私が目指しているものです。
c++ - 任意精度のためにGMPの一般的に受け入れられている代替手段はありますか?
BigIntライブラリを探すために、次の投稿に出くわし ました。MicrosoftWindows上のCまたはC++BigIntライブラリ
受け入れられた回答はGMPライブラリに言及していますが、コメント提供者の1人は、ライブラリは非常に適切にエラーが発生せず、本番コードには適さないと主張しています。このライブラリを使って長期的な開発を行った人はいますか?良い選択肢はありますか?前もって感謝します。
fft - FFT を使用して、非常に大きな整数をある基数/基数から別の基数に変換するにはどうすればよいですか?
1 つの基数/基数でエンコードされたn桁の大きな整数を取り、それを別の任意の基数に変換する既知のアルゴリズムはありますか? (基数 7 から基数 19 までとしましょう。) nは 100 000 桁を超えるなど、非常に大きくなる可能性があるため、O( n 2 ) 実行時間よりも優れたものを探しています。
高速フーリエ変換 (FFT) を使用して 2 つの巨大な整数を乗算できるアルゴリズムをいくつか見てきました。理論上の複雑さは O( n log n ) で、nは桁数です。基数変換?
c++ - キャリー フラグを使用した効率的な 128 ビット加算
C++ コードの非常に内側のループで 128 ビットの整数カウンターを使用しています。(無関係な背景: 実際のアプリケーションでは、通常のグリッドで有限差分方程式を評価しています。これには、大きな整数を繰り返しインクリメントすることが含まれます。また、64 ビットでさえ十分な精度ではありません。小さな丸めが累積して、答えに影響を与えるからです。)
整数を 2 つの 64 ビット符号なし long として表現しました。これらの値を 128 ビットの定数でインクリメントする必要があります。これは難しいことではありませんが、下位ワードから上位ワードへのキャリーを手動でキャッチする必要があります。
私は次のような作業コードを持っています:
これはタイトでシンプルなコードです。できます。
残念ながら、これは実行時間の約 20% です。キラーラインは、そのローワードテストです。それを削除すると、明らかに間違った答えが得られますが、実行時のオーバーヘッドは 20% から 4% に減少します! そのキャリーテストは特に高価です!
私の質問: C++ はハードウェア キャリー フラグを、GCC の拡張としても公開しますか? 実際のコンパイル済み命令が hiWord の追加に最後のキャリー命令を使用した追加を使用した場合、上記の test-and-add-carry 行なしで追加を実行できるようです。test-and-add-carry 行を書き直して、コンパイラに組み込みオペコードを使用させる方法はありますか?