4

コード[GCC、-O2フラグでコンパイル]

int main()
{
    vector< vector<int> > matrixa(8);
    int ff = 5;
    int s = pow(ff, matrixa.size());
    int ss = pow(double(ff), int(matrixa.size()));
    vector< vector<int> > comb(s);
    cout << ff << "^" << matrixa.size() << " = " << s << endl;
    cout << ss << endl;
    return 0;
}

出力

5^8 = 390624
390625

なぜs = 390624それがいつなのか疑問に思います390625。-O2フラグなしでコードをコンパイルすると、s = 390625。また、のキャストssは問題を修正しているようです。

どうしたの?

私のOSはWindows7Ultimatex64です。GCCのバージョンについてはよくわかりませんが、Code ::Blocks10.05が付属しています。

4

2 に答える 2

6

浮動小数点演算は完璧ではないので、

int s = pow(ff, matrixa.size());

の結果powは実際にはもっと似たもの390624.99999であり、それに切り捨てると、int効果的に390624にフラット化されます。そこで整数値(小数部が.0の浮動小数点)が予想される場合は、おそらく。の結果を丸める必要がありpowます。

于 2012-07-12T16:18:07.007 に答える
5

結果をに割り当てて、 (より大きな可能性のある)設定doubleを出力してみてください。std::setprecision丸め誤差のため、値は次のようになります390624.99999999999(または同様の値になります)。

intにキャストすると、小数部分が切り捨てられるため、が残ります390624std::round目的の結果を得るために使用します。

于 2012-07-12T16:18:48.157 に答える