3

私はデータ型を持っているunsigned __int128 data;ので、これは型の問題ではないと思いますが、なぜそれが発生しているのかわかりません

#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned __int128 z = 1911602146;
    unsigned __int128 n = 4003562209;

    //case 1
        unsigned __int128 result = fmod((pow(z, 2)  * 2), n);
        printf("%d\n", result);

    //case 2
        unsigned __int128 result_2 = fmod(pow(z, 2), n);
        printf("%d\n", result_2);
}

戻り値:

-669207835 => this is the correct option and it should be 7629321670
-480306461
4

3 に答える 3

1
printf("%d\n", result);
//      ^^

%dを期待しintます。代わりに渡しているためunsigned __int128、未定義の動作が発生します。ほとんどの場合printf、 の表現の一部を取り、resultそれを として解釈していintます。

適切な書式指定子が何であるかはわかりませんが、適切なものを見つけて使用する必要があります。また、データに対して浮動小数点関数を使用しないでください。あなたはそこで精度を失っています。

于 2015-11-10T00:31:52.337 に答える
0

最初に、計算中の浮動小数点トリップを回避します。
次に、印刷の場合のみ、printf 関数を使用するために結果 (< 10^10) を double に変換します。

unsigned __int128 z = 1911602146;
unsigned __int128 n = 4003562209;

unsigned __int128 result = (z * z * 2) % n;
printf("%.0lf\n", (double)result);

unsigned __int128 result_2 = (z * z) % n;
printf("%.0lf\n", (double)result_2);

それはあなたに与えるはずです

3625759213
3814660711

(モジュロ オペランド 'n' よりも大きいため、結果として 7629321670 を取得することはできません)

于 2015-11-10T01:00:35.807 に答える