4

fmod 関数を使用すると、非常に紛らわしい結果が得られます。

次のコード:

double x = pow(142, 35);
double y = fmod(x, 221);
std::cout << x << std::endl << y;

出力:

2.13842e+75
206

ただし、x 値をハードコーディングする場合:

double x = pow(142, 35);
double y = fmod(2.13842e+75, 221);
std::cout << x << std::endl << y;

出力は次のように変更されます。

2.13842e+75
14

これの原因が何かはわかりません。プログラム内にいくつかの醜いバグが作成されています。どんな洞察も大歓迎です。前もって感謝します。

4

2 に答える 2

3

したがって、次のような最初の結果を出力すると:

std::cout << std::fixed << x << std::endl << y << std::endl;

私はこれを見る:

2138415301692701661114266637060519453227273059369895888628790658837784821760.000000
206.000000

上記のこの数値をxs 値に次のように使用した場合:

double y = fmod(2138415301692701661114266637060519453227273059369895888628790658837784821760.000000, 221);

206次に、最初の例からforの結果を取得します。主な問題は、 IEEE doubleyで制限に達していることです。

アップデート

モジュラー電力のこのアルゴリズム:

template <typename T>
T modpow(T base, T exp, T modulus) {
  base %= modulus;
  T result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}

hereから見つけたものは正しい結果をもたらします。

于 2014-03-28T03:15:23.323 に答える