简单计算会得出错误的结果

时间:2015-12-15 18:29:43

标签: c++ math

我有这段简单的代码:

Logger::LogFloat("width", m_BMPLoader->GetWidth());
Logger::LogFloat("height", m_BMPLoader->GetHeight());
Logger::LogFloat("width / 4", (m_BMPLoader->GetWidth() / 4));
Logger::LogFloat("height / 4", (m_BMPLoader->GetHeight() /4));
Logger::LogFloat("-width / 4", -(m_BMPLoader->GetWidth() / 4));
Logger::LogFloat("-height / 4", -(m_BMPLoader->GetHeight() / 4));
Logger::LogFloat("-width /4 * Plane", -(m_BMPLoader->GetWidth() / 4) * PLANE_WIDTH);
Logger::LogFloat("-height / 4 * Plane", -(m_BMPLoader->GetHeight() / 4) * PLANE_WIDTH);

给出这个结果:

width: 128
height: 128
width / 4: 32
height / 4: 32
-width / 4: 4.29497e+009          //should be -32
-height / 4: 4.29497e+009         //should be -32
-width /4 * Plane: 4.29497e+009   //should be -160
-height / 4 * Plane: 4.29497e+009 //should be -160
编辑:解决了。我使用unsigned int并签名。

2 个答案:

答案 0 :(得分:1)

如果xunsigned int,则-x也是unsigned int,其值为pow(2,n)-x,其中nunsigned int中的位数。

您需要在某处签名到有符号类型(整数或浮动类型)。

答案 1 :(得分:1)

无符号算术对某些值n进行模2 ^ n运算。 -(m_BMPLoader->GetWidth() / 4)实际上被计算为2 ^ 32 - 32,大约是4294967264 - 因此是您的结果。