【问题标题】:erroneous return value of logarithmic function stored in a static const int (c++)存储在静态 const int (c++) 中的对数函数的错误返回值
【发布时间】:2012-04-19 14:02:17
【问题描述】:

我在我的应用程序中发现了一件很奇怪的事情。我的 World 类中有两个静态 const 整数:

class World
{
  public:
    static const int CHUNK_SIZE_X = 32;
  private:
    static const int SHIFT_X;
};

常量SHIFT_X在对应的*.cpp文件中初始化:

const int World::SHIFT_X = Ogre::Math::Log2(World::CHUNK_SIZE_X);

现在奇怪的是 SHIFT_X 中的值是 4 而不是 5。如果我从任意范围内调用 Ogre::Math::Log2(32)它正确计算的方法 5.

这到底是怎么回事?我还需要说,这只发生在 Windows 7(使用 Visual Studio Express 10)下。我的应用程序也在 GNU/Linux (Debian Squeeze) 下运行,一切正常。

【问题讨论】:

    标签: c++ static int constants


    【解决方案1】:

    Ogre::Math::Log2 返回一个Real,它实际上是一个float,你正试图将它存储为一个int。因此,如果返回的值是 4.9999999999999998,它在转换后仍然会以 4 结束。如果您想继续使用 int 而不是 float,则应将该值四舍五入。

    【讨论】:

    • 嗯,好的。但是为什么在方法内部计算后值是正确的?在我基本上写的方法中: int value = 32; int value2 = Ogre::Math::Log2(value);这里,value2 是 5。
    • 好的,谢谢。当然你是对的,我现在觉得很愚蠢。我应该看到的。无论如何,非常感谢您的快速帮助。 (不过,我仍然不了解方法中的正确计算。)
    • @BrightBit 我同意这仍然是一个很好的问题,为什么在设置静态方法时它只发生在 Visual Studio 中。但是,在转换为 int 时,对浮点值进行舍入总是更安全。如果有人对问题有更好的了解,请随时将问题留待几天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2015-12-28
    • 2012-04-20
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多