1

ちょっとしたテストプログラム:

#include <iostream>


const float TEST_FLOAT = 1/60;

const float TEST_A = 1;
const float TEST_B = 60;
const float TEST_C = TEST_A / TEST_B;

int main()
{
 std::cout << TEST_FLOAT << std::endl;
 std::cout << TEST_C << std::endl;

 std::cin.ignore();
 return 0;
}

結果 :

0
0.0166667

VisualStudio2008および2010でテスト済み。

  1. 私は他のコンパイラーに取り組み、よく覚えていれば、最初の結果を2番目の結果のようにしました。今、私の記憶は間違っている可能性がありますが、TEST_FLOATはTEST_Cと同じ値を持つべきではありませんか?そうでない場合、なぜですか?
  2. TEST_C値はコンパイル時または実行時に解決されますか?私はいつも前者を想定していましたが、それらの結果を見ると、いくつか疑問があります...
4

1 に答える 1

11

1/60

両方のオペランドが整数であるため、整数演算が実行されます。浮動小数点演算を実行するには、オペランドの少なくとも1つが浮動小数点型である必要があります。たとえば、次のいずれかが浮動小数点除算を実行します。

1.0/60
1.0/60.0
1/60.0

1.0f精度低下の警告を回避するために、代わりに使用することを選択できます。1.0タイプdoubleは、1.0fタイプはですfloat

TEST_FLOATと同じ値にするべきではありませんTEST_Cか?

このTEST_FLOAT場合、整数除算が実行され、整数除算の結果がfloat割り当てで変換されます。

このTEST_C場合、整数リテラル1とは、およびに割り当てられたときに60変換されます。次に、これらの浮動小数点数に対して浮動小数点除算が実行され、結果がに割り当てられます。floatTEST_ATEST_BTEST_C

値はTEST_Cコンパイル時または実行時に解決されますか?

コンパイラによって異なります。どちらの方法も標準に準拠しています。

于 2010-06-06T23:18:24.233 に答える