Float编译时计算没有发生?

时间:2010-06-06 23:17:15

标签: c++ compiler-optimization

一个小测试程序:

#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

在Visual Studio 2008上测试&amp; 2010。

  1. 我在其他编译器上工作,如果我记得很清楚的话,就像第二个结果那样得到第一个结果。现在我的记忆可能是错的,但TEST_FLOAT不应该具有与TEST_C相同的值吗?如果没有,为什么?
  2. 在编译时或运行时是否解析了TEST_C值?我总是假设前者,但现在我看到那些结果我有些疑惑......

1 个答案:

答案 0 :(得分:11)

1/60

两个操作数都是整数,因此执行整数运算。要执行浮点运算,至少有一个操作数需要具有浮点类型。例如,以下任何一个都将执行浮点除法:

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案例中,当整数文字160被分配到floatTEST_A时,它们会转换为TEST_B ;然后对这些浮点数执行浮点除法,并将结果赋值给TEST_C

  

在编译时或运行时是否解析了TEST_C值?

这取决于编译器;任何一种方法都符合标准。