正确的循环

时间:2011-01-23 11:56:00

标签: c++ cycle

我必须在步骤0.5中从0到5循环。但是当值为5时,循环应该反转。

bool forward = true;
int counter = 0;
float val = 5.0f;

// And somewhere in global app cycle:
if (val <= 0.0 && forward) forward = false;
if (forward) val -= .5f;

if (val >= 5.0 && !forward) forward = true;
if (!forward) val += .5f;

但结果有时是负数,而且我认为这是一个有点难看的代码。

0.2
0.18
0.16
0.14
0.12
0.1
0.08
0.06
0.04
0.02
2.98023e-08
-0.02
2.98023e-08
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
0.2
0.2
0.18

4 个答案:

答案 0 :(得分:4)

您遇到的问题是0.2无法在浮点数中准确表示。所以当你写val -= 0.2时,你真正在做的是val -= 0.20000000298023224;。因此,您累积了错误。

解决方案是不使用浮点来控制循环。请改用int,然后乘以常数以获得val。 e.g:

int inc = -1;
int i = 10;

while (whatever)
{
    if (i == 0) inc = +1;
    if (i == 10) inc = -1;

    i += inc;

    float val = i * 0.02;
}

答案 1 :(得分:2)

对于步骤1使用0到10周期的整数或使用步骤5从0到50使用整数。浮点数可以是0.00000012,因此它不小于或等于0.0。 您可以在需要时根据循环变量计算浮点数。

答案 2 :(得分:0)

| val - 5.0 | &LT; eps&amp;&amp; | val - 0 | &LT; eps在哪里| |在你的情况下fabsf()我想

还要记住,每当减去两个几乎相等(浮点表示)值时,精度会有一些损失。

答案 3 :(得分:0)

不是指定每次移动的距离,而是指定分割数量? 这样,由于精度/舍入误差,您的值不会漂移 EG:

void Step(float from, float to, int divisions)
{
    float range = to - from;
    float perDivision = range / divisions;

    int i = 0;
    for(;;)
    {
        for(; i < divisions; ++i)
        {
           UseCurrentValue(from + (i * perDivision));
        }
        for(; i > 0; --i)
        {
           UseCurrentValue(from + (i * perDivision));
        }
    }
}

void UseCurrentValue(float val)
{
   // Do something with val here.
}