0

次の行は、私の本当に「役に立たない」C++プログラムの一部です...これは、「unsigned long long」の長さのために「求められている」2^128ではなく、最大2^63までの2のべき乗を計算しています。 15桁の精度を持つ数値に対して提案されている変数...!!!

それだけです....16バイト以上の変数が必要です...これは以下によって提供されていません:

-__int128 (Visual Studio 2010 は文字を青に変えますが、赤い線とデバッグでのエラー: 「キーワードはこのアーキテクチャではサポートされていません」32 ビット システム)

-Boost::Projects...私がプロのサイトに出くわしたときに「私は宇宙で迷子になった」という新参者であるため、グーグルで検索した後(boost::bigint...存在しますか???ないですか修辞的な質問)

(もちろんマルチタイピングロング)

int main()
{   
    unsigned long long result;
    int i;
    const int max=128;

    for(i=0, result=1ll; i <= max; ++i,result *=2 )
        cout<<setw(3)<< i <<setw(32)<< result <<endl;

    system("pause");
    return 0;
}
4

3 に答える 3

1

You could find a "bigint" implementation in C++ that implements operator<<() to output to ostream's, but if all you want to do is print out powers of 2 to a console or text string, and you don't need to actually do "bigint" math (except to compute those powers-of-2), there's a simpler approach that will give you powers of 2 out to pretty much as large as you want to go & have the patience to look through:

Store each decimal digit (numbers 0 through 9) as a separate entity, perhaps as an array of chars or ints or in a std::list of the digits. Using a std::list has the advantage that you can easily add new digit places at the front as your number gets bigger, but you can do that almost as easily by storing the digits in reverse order in a std::vector (of course to print them, you have to iterate from the back to the front to print the digits in their proper order).

Once you figure out how you want to store the digits, your algorithm for doubling the number is as follows: Iterate over the digits of the large number, doubling each (mod 10 of course) and carrying any overflow (i.e. a bool that says if its result... before the %10... was greater than 9) from that digit to the next. On the next digit, double it first and then add 1 if the previous digit overflowed. And if that result overflows, carry that overflow on to the next digit & continue to the end of all of the digits. At the end of the digits, if doubling the last digit & adding any overflow from the previous digit caused an overflow in that last digit, then add a new digit & set it to 1. Then print the resulting list of digits.

With this algorithm, you can print powers-of-2 as large as you like. Of course they're not "numbers" in the sense that you can't use them directly in C++ math ops.

于 2013-05-10T22:47:11.577 に答える
1

最新の CPU では、SSE および AVX 組み込み関数は最大 256 バイトになります。名前は__m128i__m256iです。

于 2013-05-10T22:32:28.010 に答える
0

128 ビット整数は非常に大きな整数です。独自のデータ型を実装する必要があります。s の配列を作成し、shortそこに数値 (数字) を格納し、乗算を実装することができます。これは、数学ノートで行うのと同じように、おそらく最も簡単な方法です。

ここに画像の説明を入力

もちろん、これはまだ終わっていません!「2」がまだありません;)

于 2013-05-10T22:26:39.787 に答える