0

可能重复:
处理浮点数的准确性问题

我正在编写一个 OpenGl 动画并使用浮点变量“时间”来跟踪时间。我将“时间”变量增加 0.01。每当“时间”达到整数值时,我都有一定的条件要满足。问题是在一定时间后,浮点增量显示出奇怪的行为。我从时间 = 0 开始,我看到“时间”达到 0.83 后,下一个值为 0.839999。我虽然这可能与浮点精度有关,所以我尝试使用双精度/长双精度,我发现代码没有达到值 1.00,而是达到了值 1.0000007。

我尝试增加“0.01f”而不是“0.01”,但没有成功。这是 Visual Studio 中的一些错误还是我做错了?我可以发布代码,但我认为它没有多大用处,因为我只在一个地方分配“时间”,而它只是在其他地方使用。

4

3 回答 3

4

除非您确切知道自己在做什么,否则永远不要比较浮点值是否相等。为此,我强烈建议您使用整数(可能是毫秒的整数)。

有关更多信息,请参阅每位计算机科学家应了解的浮点运算知识

浮点数是一种固定精度格式。这是固定精度格式的固有限制。

例如,假设您使用了六位十进制数字的精度。三分之一将是.333333。但是如果你把三分之一加三倍,你得到.999999的是 ,而不是 1。这就是野兽的本性。

于 2012-12-04T04:10:04.217 回答
2

不完全推荐这个,但问题是 0.1 不能完全表示为 double。1.0就可以了。因此,如果您将时间步长设为 2 的(负)幂,您会发现不同。举例说明:

    double delta = 1.0 / 8;
    int stopper = 10;
    int nextInt = 1;
    for (double t = 0; t <= stopper; t += delta)
    {
        if (t == nextInt)
        {
            std::cout << "int ";
            ++nextInt;
        }
        else 
            std::cout << "    ";
        std::cout << t << std::endl;
    }
于 2012-12-04T04:24:54.823 回答
1

只需在每次增量后四舍五入“时间”,以确保它保持一个合理的值。

像这样的东西:

double round(double value, double precision)
{
    return floor(value / precision + 0.5) * precision;
}
time = round(time + 0.1, 0.1);
于 2012-12-04T04:18:40.153 回答