0

私の Ruby (MRI) の整数は、オーバーフローを拒否します。クラスが fixnum から bignum に変更されたことに気付きましたが、これがどのようにモデル化されているのか、Ruby がこれらの巨大な整数の演算を実行するためにどのようなプロセスを使用しているのか疑問に思っています。この動作は、SCHEME や他の環境でも見られます。

C プログラムで同様のものを実装したいので、bignum + bignum がプリミティブ演算にどのように還元されるかを知りたいので、質問します。

ポインタはありますか?

4

4 に答える 4

1

Pythonもこれを行います。

基本的に、数値をハードウェアアーキテクチャに自然に適合するビットの文字列として扱うのではなく(たとえば32ビット)、数値を32ビットの数字の文字列として扱い、1つの32ビットからのキャリーを処理するすべての算術演算を実装します。 -別のビット桁。また、数値が長くなるにつれて、追加の32ビット桁を割り当てる必要があります。これは見た目よりも簡単です。

たとえば、99*99は100*100(10,000)よりも小さいため、2つの2桁の数値を乗算すると4桁以下の結果が得られると想定できます。各桁が32ビットワードの場合も同じことが言えます。

楽しみのために、固定の2進数を許可するタイプを使用して、これをRubyに実装してみることをお勧めします。FixNumクラスが機能すると思います。

于 2009-10-17T21:19:09.400 に答える
1

Numerical Recipes for C book のセクション 20.6 を見てください: http://www.nrbook.com/a/bookcpdf.php

これは、任意精度の数学の優れた実装です。凝ったものにしたい場合は、演算子をオーバーロードしてからこれらの関数を実装する C++ クラスを作成します。または、直接電話することもできます。

于 2009-10-19T22:49:52.860 に答える
0

Erlang もこれを行います。erl_interface モジュールのソース コード (C) を見ることができます。

于 2009-10-17T19:35:00.150 に答える
0

基本的に、長い足し算/掛け算/割り算/引き算に要約されます。そこから実行できる最適化はたくさんあるので (duh)、独自に展開することはあまりお勧めしません。アプリに静的または動的にリンクする GMP (gnu multi-precision) プロジェクトを確認することをお勧めします。使い方は難しくありませんが、より簡単に操作できる C++ やその他のラッパーがいくつかあります。浮動小数点処理を行っている場合は、丸めを適切に処理する MPFR を入手してください。

于 2009-10-17T19:37:18.320 に答える