1

テンプレート パラメーターとして使用されるクラスのメンバー関数内に、次のコードを含む関数があります。

double x = /*Something operation returning double*/;
x /= CubeWidth; /*CubeWidth is a class member*/
cout << "Element after centering and normalization = " << x << endl;
cout << "and after adding 1 and truncating = " << x+1 << endl;
cout << "then static cast = " << (int) x+1 << endl;

この関数の出力は

Element after centering and normalization = 1
and after adding 1 and truncating = 2
then static cast = 1

明らかに、最後の行は答え 2 を与えるはずです。

テンプレートパラメーターとして使用せずにまったく同じクラスをインスタンス化すると、この出力は得られず、正しい出力が得られます。

なぜこれが起こっているのか誰にも教えてもらえますか?

4

1 に答える 1

3

ほとんどの場合x(倍精度) は正確1には ではなく、 です0.9999999...。印刷して正確な値を確認するか、実際に何が正しいかを確認してくださいx==1.0x<1.0または、出力に数字を追加します。

cout << "and after adding 1 and truncating = " << setprecision( 15 ) << x+1 << endl;

整数への丸めは、コンマの後のすべての桁を破棄するため、 に1.999999...なり1ます。

于 2013-10-29T17:40:27.737 に答える