【问题标题】:Float compile-time calculation not happening?浮点编译时计算没有发生?
【发布时间】:2010-06-06 23:17:14
【问题描述】:

一个小测试程序:

#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 和 2010 上测试。

  1. 我曾在其他编译器上工作过,如果我没记错的话,第一个结果就像第二个结果一样。现在我的记忆可能是错误的,但 TEST_FLOAT 的值不应该与 TEST_C 相同吗?如果不是,为什么?
  2. TEST_C 值是在编译时还是在运行时解析的?我一直认为是前者,但现在我看到这些结果我有些怀疑......

【问题讨论】:

    标签: c++ compiler-optimization


    【解决方案1】:

    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 在分配给TEST_ATEST_B 时会转换为float;然后对这些浮点数执行浮点除法并将结果分配给TEST_C

    TEST_C 的值是在编译时还是在运行时解析的?

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

    【讨论】:

    • 啊!我知道我错过了一些明显的东西!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-03-10
    • 2012-03-04
    相关资源
    最近更新 更多