visualstudio2010显示了浮动/双增量上的奇怪行为



可能的重复:
处理浮点数中的精度问题

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

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

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

请参阅每一位计算机科学家应该知道的关于浮点运算的更多信息。

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

例如,假设您使用了六位小数位数的精度。三分之一将是CCD_ 1。但如果你三次加三分之一,你得到的是.999999,而不是1。这就是野兽的本性。

不完全建议这样做,但问题是0.1不能完全表示为双精度。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;
}

在每次增量后四舍五入"时间",以确保它保持合理的值。

类似的东西:

double round(double value, double precision)
{
return floor(value / precision + 0.5) * precision;
}
time = round(time + 0.1, 0.1);

相关内容

最新更新