浮点赋值不正确

时间:2012-08-31 12:56:24

标签: c++

我有以下课程

class Viewport
{
public:
    Viewport();
    ~Viewport();

    void setSize(float x, float y);

private:
    float  _X;
    float  _Y;
};

void Viewport::setSize(float x, float y)
{
    //Conditionals used to make sure that the viewport stays inside the [0.0f, 1.0f] range

    if(x < 0.0f)
        _X = 0.0f;
    else if(x > 1.0f)
        _X = 1.0f;
    else
        _X = x;

    if(y < 0.0f)
        _Y = 0.0f;
    else if(y > 1.0f)
        _Y = 1.0f;
    else
        _Y = y;

}

我创建了视口矢量

Viewport vps[3];

uint _NumCascades = 3;

for(uint i = 0; i < _NumCascades; i++)
    vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);

i == 1i==2在行_X = x;处发生奇怪错误,因为_X被赋值为1051372203而不是0.33333334f

3 个答案:

答案 0 :(得分:8)

所有属性,特别是_X和_Y,都是为编译器保留的,并且编译器使用_X(因为它太短)并不可能用于其他事情并使代码混淆。

C ++语言保留以实现的下划线开头的名称子集。在这种情况下,所有范围/案例都保留下划线和主要资本。规则并不是非常复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上引入下划线。

答案 1 :(得分:5)

位模式1051372203,0x3eaaaaab是IEEE754格式中float1.0f/3的位模式。因此赋值工作,并且在某些地方,位模式被解释为整数。对于i == 0int(或unsigned int)0和float 0的位模式相同。

无法从发布的代码中推断出发生这种情况。

答案 2 :(得分:-1)

对于数组中的每个视口,您必须调用构造函数(创建对象):

for(uint i = 0; i < _NumCascades; i++)
{
    vps[i] = ViewPort();
}

您还需要实现构造函数并为类中的所有属性赋值,例如: 0。在划分1.0f/_NumCascades之前,您应该使用_NumCascadesfloat转换为static_cast<>()以防止C++内联投射:

vps[i].setSize(static_cast<float>(i) * (1.0f/static_cast<float>(_NumCascades)), 0.0f, 1.0f/static_cast<float>(_NumCascades), 1.0f);

现在,你有一个指针数组,它们可能指向内存中的随机位置,因此是随机值。