私はGMPライブラリを使用して円周率プログラムを作成しています。これは約7兆桁の円周率を計算します。問題は、小数点以下の桁数を保持するために必要なビット数がわからないことです。
3 に答える
7 兆桁の数字は、10^(7 兆) 個の異なる数字を表すことができます。
x ビットは 2^x の異なる数値を表すことができます。
だからあなたは解決したい:
2^x = 10^7000000000000
両辺の底が 2 の対数を取ります。
x = log2(10^7000000000000)
log(a^b)
=を思い出してくださいb * log(a)
:
x = 7000000000000 * log2(10)
23253496664212
ビットを取得します。念のため、あと 1 つか 2 つ追加します。ただし、それらを保持するためのペタバイトを見つけるのは幸運です.
もっと興味深いアルゴリズムが必要になると思います。
応答の回答に書かれていることについて、1 つだけ訂正したいと思います。
log(a^b) = a * log(b) を思い出してください。
まあそれは反対です:
log(a^b) = b * log(a)
2^10 = 1024 なので、10 ビットは 3 桁より少し多い数を表します。7 兆桁について話しているので、それは 23 兆ビット、または約 3 テラバイトのようなもので、私が最後に訪れたコストコから 1 台のドライブで取得できる量よりも多くなります。
あなたは野心的になりすぎているかもしれません。各操作でディスク全体を読み書きするための I/O 時間が気になります。
(これを解く数学的な方法は、対数を使用することです。これは、表現するのに 7 兆桁の数を表すには、約 7 兆の対数底 10 があるためです。既存の基数で数値の対数を見つけ、基数を変換すると、'あなたの答えが得られました. 基数 2 と基数 10 の間の簡略表現については, 10 ビット == 3 桁を使用します. これはそれほど間違っているわけではないからです. 2 の底 10 の対数は .3 であると言われていますが, 実際には .301 に似ています. )