n> 47の後にウッダル数を計算するプログラムが間違った結果を生成するのはなぜですか?

最大のウッダル数を計算するこの関数の場合 n = 64

そしてwoodallためのアルゴリズムはWであり、N = N⋅2 N - 1

for (int n = 1; n <= 64; ++n)
{
    a[n - 1] = (n * (exp2(n))) - 1;
}

しかしn、47を超えると、結果が間違ってしまい- 1、の結果を忘れているように見えn * (exp2(n))ます。

これが、icoutが経由する値の場合の出力です。

std::cout << i << ":\t" << std::setprecision(32) << a[i - 1] << std::endl;

...前は正しい

n
45:     1583296743997439
46:     3236962232172543
47:     6614661952700415
48:     13510798882111488
49:     27584547717644288
50:     56294995342131200

...後は正しくありません

fora[]はunsignedlongintです

- 1ただし操作を独自のforループに分離すると、関数は正しい結果を生成します

for (int n = 1; n <= 64; ++n)
{
    a[n - 1] = (n * (exp2(n)));
}


for (int n = 1; n <= 64; ++n)
{
    a[n - 1] = a[n - 1] - 1;
}
バトシェバ

exp2(n)を返しますdouble

IEEE754(浮動小数点型の非常に一般的な仕様)では、2の52乗までの正確な整数のみが得られます。その後、近似値が得られます。

式全体が暗黙的な型変換によるものn * (exp2(n))) - 1であるdoubleため、52番目のウッダル数の前に問題が発生します計算上の癖により、問題を引き起こすのは-1です。もう一方の項が2の累乗の適切な倍数であるため、精度を損なうことなく倍数として表すことができます。これが、2番目のスニペットが機能する理由ですが、最初のスニペットは機能しません。

64ビットのシステムではint、2の63乗で整数の制限(および未定義の動作)に達します。

あなたの最善の策は、おそらく連続するウッダル数の漸化式を使用して、純粋にunsigned算術でウッダル数を生成することです(との関係<<と2の累乗に注意してください)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この関数が対数時間計算量(数値のn乗根を計算する)を持っているのはなぜですか?

分類Dev

「!test-z」が機能しているのに、bashの「test-n」コマンドが$ @(ドルで)位置パラメーターに対して間違った結果を与えるのはなぜですか?

分類Dev

「!test-z」が機能しているのに、bashの「test-n」コマンドが$ @(ドルで)位置パラメーターに対して間違った結果を与えるのはなぜですか?

分類Dev

forループを使用するフィボナッチの時間計算量がO(n)ではなくO(n ^ 2)であるのはなぜですか?

分類Dev

実行時間がO(n ^ 3)の関数のタイミングを計っていますが、タイミング結果にこれが表示されません。なぜこれが発生するのですか?

分類Dev

''文字+数値で\ nをループすると、間違ってカウントされるのはなぜですか

分類Dev

フィボナッチ数列を計算するための再帰法の時間計算量が2 ^ nであるのに、2 ^ n ^ 2ではないのはなぜですか?

分類Dev

ループのカウンターロジックを変更するだけで、2つのネストされたループO(n ^ 2)の複雑さを使用して、2つの合計の問題を解決するのがはるかに高速になるのはなぜですか?

分類Dev

変数が空の場合でもtest-nがtrueを返すのはなぜですか?私は何が間違っているのですか?

分類Dev

使用可能なストレージにダウンロードするnプロセスのディスクがいっぱいになるまでの時間を計算する

分類Dev

ユーザーに数値 n を尋ね、合計を計算するか、n の階乗を計算するかを選択できるようにするプログラム

分類Dev

forループを使用した後に取得した「n」出力の平均を計算して変数に割り当てるにはどうすればよいですか?

分類Dev

nがconst値であるのにint x [n]が間違っているのはなぜですか?

分類Dev

nがconst値であるのにint x [n]が間違っているのはなぜですか?

分類Dev

nがconst値であるのにint x [n]が間違っているのはなぜですか?

分類Dev

KMP障害関数をO(n)時間で計算できるのはなぜですか?

分類Dev

これは、0からnまでのkの合計を計算するCプログラムです:nCk。セグメンテーション違反が発生しています

分類Dev

Cでn> = 34の場合、配列を使用して階乗値を格納すると間違った値が出力されるのはなぜですか

分類Dev

N体シミュレーションで計算を少なくすると、プログラムの実行速度が遅くなりますか?

分類Dev

再帰関数がリストを更新するのはなぜですか(nのフィボナッチを計算する)

分類Dev

R なぜ n_distinct が異なる結果を提供するのですか

分類Dev

最初のnアイテムをドロップし、最後のnアイテムをドロップしないと、スライスの容量が変化するのはなぜですか?

分類Dev

無限級数の最初のN項を加算してsin(x)を計算すると、常に0.00000が返されるのはなぜですか?

分類Dev

各グループの2つの数の差の合計が最小になるように、N個の数をN / 2個のグループ(各グループに2個の数)に分割するにはどうすればよいですか?

分類Dev

この同期されたプログラムが間違った結果を返すのはなぜですか?

分類Dev

nカスタムスレッドの到着スレッドグループと自由形式の到着スレッドグループで合計到着率がどのように計算されるかをグラフ化します。

分類Dev

Scalaではn個の数値の合計の結果が間違っています

分類Dev

時間計算量O(n ^ 2)のアルゴリズムが与えられた場合、入力nを3倍にするとどうなりますか?

分類Dev

O(n ^ 2)の予想される時間計算量ですが、結果としてO(n)になります。理由を説明できる人はいますか?

Related 関連記事

  1. 1

    この関数が対数時間計算量(数値のn乗根を計算する)を持っているのはなぜですか?

  2. 2

    「!test-z」が機能しているのに、bashの「test-n」コマンドが$ @(ドルで)位置パラメーターに対して間違った結果を与えるのはなぜですか?

  3. 3

    「!test-z」が機能しているのに、bashの「test-n」コマンドが$ @(ドルで)位置パラメーターに対して間違った結果を与えるのはなぜですか?

  4. 4

    forループを使用するフィボナッチの時間計算量がO(n)ではなくO(n ^ 2)であるのはなぜですか?

  5. 5

    実行時間がO(n ^ 3)の関数のタイミングを計っていますが、タイミング結果にこれが表示されません。なぜこれが発生するのですか?

  6. 6

    ''文字+数値で\ nをループすると、間違ってカウントされるのはなぜですか

  7. 7

    フィボナッチ数列を計算するための再帰法の時間計算量が2 ^ nであるのに、2 ^ n ^ 2ではないのはなぜですか?

  8. 8

    ループのカウンターロジックを変更するだけで、2つのネストされたループO(n ^ 2)の複雑さを使用して、2つの合計の問題を解決するのがはるかに高速になるのはなぜですか?

  9. 9

    変数が空の場合でもtest-nがtrueを返すのはなぜですか?私は何が間違っているのですか?

  10. 10

    使用可能なストレージにダウンロードするnプロセスのディスクがいっぱいになるまでの時間を計算する

  11. 11

    ユーザーに数値 n を尋ね、合計を計算するか、n の階乗を計算するかを選択できるようにするプログラム

  12. 12

    forループを使用した後に取得した「n」出力の平均を計算して変数に割り当てるにはどうすればよいですか?

  13. 13

    nがconst値であるのにint x [n]が間違っているのはなぜですか?

  14. 14

    nがconst値であるのにint x [n]が間違っているのはなぜですか?

  15. 15

    nがconst値であるのにint x [n]が間違っているのはなぜですか?

  16. 16

    KMP障害関数をO(n)時間で計算できるのはなぜですか?

  17. 17

    これは、0からnまでのkの合計を計算するCプログラムです:nCk。セグメンテーション違反が発生しています

  18. 18

    Cでn> = 34の場合、配列を使用して階乗値を格納すると間違った値が出力されるのはなぜですか

  19. 19

    N体シミュレーションで計算を少なくすると、プログラムの実行速度が遅くなりますか?

  20. 20

    再帰関数がリストを更新するのはなぜですか(nのフィボナッチを計算する)

  21. 21

    R なぜ n_distinct が異なる結果を提供するのですか

  22. 22

    最初のnアイテムをドロップし、最後のnアイテムをドロップしないと、スライスの容量が変化するのはなぜですか?

  23. 23

    無限級数の最初のN項を加算してsin(x)を計算すると、常に0.00000が返されるのはなぜですか?

  24. 24

    各グループの2つの数の差の合計が最小になるように、N個の数をN / 2個のグループ(各グループに2個の数)に分割するにはどうすればよいですか?

  25. 25

    この同期されたプログラムが間違った結果を返すのはなぜですか?

  26. 26

    nカスタムスレッドの到着スレッドグループと自由形式の到着スレッドグループで合計到着率がどのように計算されるかをグラフ化します。

  27. 27

    Scalaではn個の数値の合計の結果が間違っています

  28. 28

    時間計算量O(n ^ 2)のアルゴリズムが与えられた場合、入力nを3倍にするとどうなりますか?

  29. 29

    O(n ^ 2)の予想される時間計算量ですが、結果としてO(n)になります。理由を説明できる人はいますか?

ホットタグ

アーカイブ