web-dev-qa-db-ja.com

多数の科学的記数法を回避するにはどうすればよいですか?

私は2 ^ 1000をやっていて、これを手に入れています:

1.07151e + 301

これをe + 301なしで実際に適切な数に変換する方法はありますか、または少なくとも、e + 301パーツを操作して、これを実数に変換する方法をどこで確認できるかを誰かに教えてもらえますか?

23
AntonioCS

ですから、あなたが本当に望んでいるのは、科学的記数法なしでそれを印刷する能力だけだと思います。 printfを使用している場合、必要なものは次のとおりです。

printf( "%f1000.0", value );
// note that 1000 is way larger than need be,
// I'm just too lazy to count the digits

coutを使用して、次のようなことを試してください。

cout.setf(ios::fixed);
cout << setprecision(0) << value;

2の累乗(2 ^ 1000対10715 ...)で印刷したい場合は、自分で行ってください。

12
tvanfosson

マシンレジスタで直接操作できる数には、実際的な制限があります。倍精度浮動小数点数を使用している場合、合計64ビットがあり、そのうちのいくつかは仮数、いくつかは指数、1は符号ビットに割り当てられます。

2 ^ 1000は、精度を失うことなく表現するために1001ビット整数を必要とします。このような数値を処理するには、 GNU MP などの大きな数値をサポートするライブラリを使用する必要があります。

13
Louis Gerbarg

長い数値用に特別に設計された数値クラスを使用する必要があります。

2 ^ 1000を正確な数値として表すには、定義上、実際に1001の2進ビットを保持する数値形式が必要です。通常の最長のプリミティブ整数形式は、通常64ビットのみです。

ところで、答えは次のとおりです。

% Perl -Mbigint -e 'print 2**1000'
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
10
Alnitak

C++で自分で実行したい場合は、たとえば、数字配列を作成して自分で計算を実行できます。テストおよび検証された例:

unsigned int result[400]; // result digits
unsigned int i, j, carry;

// Initialize result digits
for (i = 0; i < 399; i++) {
  result[i] = 0;
}
result[399] = 2;

for (i = 2; i <= 1000; i++) { // Calculate 2^i
  carry = 0;
  for (j = 399; j > 0; j--) {
    result[j] <<= 1;    // multiply with 2
    result[j] += carry; // add carry
    carry = result[j] / 10;
    result[j] %= 10;    // we want one digit (0-9) only
  }
}

printf("2 ^ 1000 = ");
// print result digits
for (i = 0; i < 400; i++) {
  if (result[i] != 0) { // no leading zeros, please
    for (j = i; j < 400; j++) {
      printf("%d", result[j]);
    }
    break;
  }
}
printf("\n");
4
schnaader

cout <<固定<< your_number;

しかし、おそらく整数は表示されません。誰かが前に言ったように、あなたはクラスを書く必要があります。

2
Manipulators

アプリケーションロジックで許可される場合の1つのオプションは、操作する単位を変更することです。

ニューヨークからパリまでの距離をオングストロームで測定する場合は、代わりにマイルまたはキロメートルを選択してください。純粋な数学的要件(たとえば、暗号学の素数の因数分解や、リーマン予想の研究など)を除いて、その数桁の精度を維持する必要はめったにありません。

一方、その数の桁で完全に正確な整数値を必要とする何かをしている場合は、おそらく大きな数を処理するように設計された専用のソフトウェアを入手する必要があります...そのようなソフトウェアは間違いなく利用可能ですが、私はそれに慣れていません範囲。 (コスト、ベンダー、機能など)コストが問題であり、自分で作成することを考えている場合、そのアプローチが努力に値するかどうかを知るために何が関係しているかについては十分にわかりません...

2
Charles Bretana

変数タイプがサポートできる限り正確な数値を取得しています。その数は1のオーダーで、その後に301個のゼロが続きます。正確な数値を取得するには、多数をサポートするライブラリを使用するか、その種の数学用に作成された言語(maple、matlabなど)を使用する必要があります。

0
tloach