0

我有一个问题。在运行模拟之前,我在“invKin”类中获得了这个函数来设置一些参数:

void IK_mm4::set_timesetting(double *T_horiz_, double *delta_t_)
{
  T_horiz  = T_horiz_;
  delta_t  = delta_t_;

  k_end = (int)floor((*T_horiz)/(*delta_t));

  cout << "k_end = " << k_end <<endl;
}

它在我的主文件中被调用

...
double delta_t = 5e-3;
double *T_desired = new double(5.0);
...
invKin.set_timesetting(T_desired,&delta_t);
...

问题是现在。在我大学的电脑上,一切都很好,k_end 的值应该是“1000”。在我的家用电脑上,系统以某种方式返回值“999”。如果我将 *T_desired 的值更改为“0.05”,则 cout 会在两台 PC 上给出正确的“10”值。

我已经检查过使用变量

double k_end_test = (*T_horiz)/(*delta_t);

这给出了“1000”的正确解决方案。错误必须在 floor 函数或 int 转换中。如果我做

int k_end_test2 = (int)(k_end_test);

或者

double k_end_test2 = floor(k_end_test);

结果总是'999'。

有人知道这可能来自哪里吗?

我很感谢任何提示!谢谢你!

4

1 回答 1

4

这是有限精度表示的本质。

例如,考虑六个十进制数字的精度。当然,这不是double用途,但概念完全相同。1/3具有.333333六位小数精度。30 * (1/3)也是如此9.99999。如果向下舍入为整数,则得到9,而不是10。这是您看到的问题。

如果您不想要这种行为,请不要使用浮点数。

将一个小的“delta”添加到您传递给的值可能就足够了floor

于 2013-01-23T10:42:40.300 回答