5

C++ プログラムで pow を使用する必要があり、pow()この方法で関数を呼び出す場合:

long long test = pow(7, e);

どこ

e は、値が 23 の整数値です。

私はいつも821077879結果として得ます。Windows電卓で計算すると、27368747340080916343..何が問題なのですか?):

さまざまなタイプにキャストしようとしましたが、ここでは何も役に立ちませんでした.この理由は何でしょうか? pow()どうすれば正しく使えますか?

ありがとう!

4

3 に答える 3

8

結果は に収まりませんlong long

非常に大きな数を処理したい場合は、GMPのようなライブラリを使用してください

または、浮動小数点として保存します (これは正確ではありません)。

モジュロの適用:

const unsigned int b = 5; // base
const unsigned int e = 27; // exponent
const unsigned int m = 7; // modulo

unsigned int r = 1; // remainder

for (int i = 0; i < e; ++i)
  r = (r * b) % m;

// r is now (pow(5,27) % 7)
于 2011-11-17T21:59:35.377 に答える
6

7 23は大きすぎて a に収まりませんlong long(64 ビットと仮定)。値が切り捨てられています。

編集:ああ、なぜあなたpow(b, e) % mはただの代わりに欲しいと言わなかったのpow(b, e)ですか?結局bigintは必要ないので、物事はずっと簡単になります。すべての算術 mod を実行するだけですm。Pubby のソリューションは機能しますが、ここではより高速なソリューションを示します (O(e) ではなく O(log e))。

unsigned int powmod(unsigned int b, unsigned int e, unsigned int m)
{
   assert(m != 0);

   if (e == 0)
   {
      return 1;
   }
   else if (e % 2 == 0)
   {
      unsigned int squareRoot = powmod(b, e / 2, m);
      return (squareRoot * squareRoot) % m;
   }
   else
   {
      return (powmod(b, e - 1, m) * b) % m;
   }
}
于 2011-11-17T21:58:17.303 に答える
4

ライブでご覧ください: https://ideone.com/YsG7V

#include<iostream>
#include<cmath>
int main()
{
    long double ldbl = pow(7, 23);
         double dbl  = pow(7, 23);
    std::cout << ldbl << ", " << dbl << std::endl;
}

出力: 2.73687e+19、2.73687e+19

于 2011-11-17T22:00:05.673 に答える