C++ 不正确的浮动定位

C++ 不正确的浮动定位,c++,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

我有以下课程

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();
无效设置大小(浮动x、浮动y);
私人:
浮动X;
浮动;
};
无效视口::设置大小(浮动x、浮动y)
{
//用于确保视口保持在[0.0f,1.0f]范围内的条件
如果(x<0.0f)
_X=0.0f;
如果(x>1.0f),则为else
_X=1.0f;
其他的
_X=X;
如果(y<0.0f)
_Y=0.0f;
如果(y>1.0f),则为else
_Y=1.0f;
其他的
_Y=Y;
}
我创建了视口的矢量

Viewport vps[3];

uint _NumCascades = 3;

for(uint i = 0; i < _NumCascades; i++)
    vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);
Viewport-vps[3];
uint _NumCascades=3;
对于(uint i=0;i<\u NumCascades;i++)
vps[i].设置大小(i*(1.0f/_NumCascades),0.0f);

i==1
i==2
\ux=X行出现奇怪的错误时
因为
\u X
为数组中的每个视口分配了值
1051372203
,而不是
0.3333333 4f

,因此必须调用构造函数(创建对象):


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

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


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

1051372203,
0x3eaaaab
的位模式是IEEE754格式的
浮点
1.0f/3
的位模式。因此赋值是有效的,在某些地方,位模式被解释为一个整数。对于
i==0
int
(或
unsigned int
)0和
float
0的位模式相同


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

1051372203的位模式,
0x3eaaaaab
是IEEE754格式的
浮点值
1.0f/3
的位模式。因此赋值是有效的,在某些地方,位模式被解释为一个整数。对于
i==0
int
(或
unsigned int
)0和
float
0的位模式相同


发生这种情况的地方不能从发布的代码中推断出来。

您的所有属性,尤其是X和Y,都是为编译器保留的,而且编译器使用X(因为它很短)来表示其他内容并使您的代码变得混乱并非不可能


C++语言保留了一个名称的子集,该名称从下划线开始。在这种情况下,所有作用域/大小写中都保留下划线和前导大写字母。规则并不十分复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上完全使用下划线。

所有属性,尤其是X和Y,都是为编译器保留的,编译器使用X(因为它很短)也不是不可能的为了其他的东西,让你的代码变得混乱


C++语言保留了一个名称的子集,该名称从下划线开始。在这种情况下,所有作用域/大小写中都保留下划线和前导大写字母。这些规则并不十分复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上完全引入下划线。

在我的机器上运行良好,而且在某些特定的编译器版本中,这看起来是一个非常严重的错误,不可能只是一个模糊的错误。这段代码正是导致这种奇怪行为的代码,还是只是一个简化版本?设置X和Y应该可以工作。然而,对宽度和高度使用运算符-=是很奇怪的。这就是您的全部代码吗?您没有
main
函数,而且就我所知,
uint
不是一种类型。您能否发布一个完整的可编译示例来演示您的问题?鉴于您的所有属性,尤其是
\ux
\uy
,都是为编译器保留的,因此编译器使用
\ux
进行其他操作并使您的代码混淆并非不可能。请不要在你的名字中使用前导下划线。@Gorpik是的,这是我的代码的简化版本,因为我的程序太复杂了,我也尝试过编译这个简化版本,它工作正常。。。我将尝试缩小产生错误的代码范围。在我的机器上运行良好,而且在某些特定的编译器版本中,这看起来是一个非常严重的错误,不可能只是一个模糊的错误。这段代码正是导致这种奇怪行为的代码,还是只是一个简化版本?设置X和Y应该可以工作。然而,对宽度和高度使用运算符-=是很奇怪的。这就是您的全部代码吗?您没有
main
函数,而且就我所知,
uint
不是一种类型。您能否发布一个完整的可编译示例来演示您的问题?鉴于您的所有属性,尤其是
\ux
\uy
,都是为编译器保留的,因此编译器使用
\ux
进行其他操作并使您的代码混淆并非不可能。请不要在你的名字中使用前导下划线。@Gorpik是的,这是我的代码的简化版本,因为我的程序太复杂了,我也尝试过编译这个简化版本,它工作正常。。。我将尝试缩小产生错误的代码范围。
for(uint i = 0; i < _NumCascades; i++)
{
    vps[i] = ViewPort();
}
vps[i].setSize(static_cast<float>(i) * (1.0f/static_cast<float>(_NumCascades)), 0.0f, 1.0f/static_cast<float>(_NumCascades), 1.0f);