3

私のコード:

int main()
{
long long a = pow(2,63) - 1;
long long b = pow(2,63);
double c  = pow(2,63) - 1;
double d = pow(2,63);
printf("%lld %lld \n%f %f \n%lld %lld\n", a, b, c, d, (long long)c, (long long)d);

return 0;
}

実行結果は次のとおりです (win7 x64 で gcc を使用したコードブロック):

9223372036854775807 9223372036854775807
9223372036854775800.000000 9223372036854775800.000000
-9223372036854775808 -9223372036854775808

質問:

なぜa == bですか?

c == dの精度のためにそれを知っていdoubleます。

しかし、なぜそう(long long)c(long long)dはないの9223372036854775800ですか?

そしてなぜ(long long)c != a そして(long long)d != b

4

6 に答える 6

4

pow(2,63) - 1すべて倍精度浮動小数点演算で行われます。特に、-1は and に変換され-1.0、それは小さすぎて問題になりません

于 2013-10-08T14:13:29.477 に答える
1

powdouble および double の失われた精度を返すためです。だからa==b

于 2013-10-08T14:13:01.760 に答える
0

pow(2, 63)と同等pow((double) 2, (double) 63)です。

実際、C++11 26.8 [c.math] パラグラフ 3 は<cmath>宣言を提供し、double pow(double, double)パラグラフ 11 はそれを述べています (私の強調)

  1. double パラメーターに対応する引数の型が long double の場合、double パラメーターに対応するすべての引数は実質的に long double にキャストされます。
  2. それ以外の場合、パラメーターに対応する引数doubleに型doubleまたは整数型がある場合、パラメーターに対応するすべての引数doubleは効果的に にキャストされdoubleます。
  3. それ以外の場合、double パラメーターに対応するすべての引数は実質的に float にキャストされます。

したがって、リテラル2および63はと同等です。返される型は、と の違いを「見る」ために必要な 63 ビットの精度を持たないです。intpow(2, 63)pow((double) 2, (double) 63)double2^632^63 - 1

この投稿を読むことと、Howard Hinnant による優れた回答をお勧めします。

于 2013-10-08T14:14:52.790 に答える