对于较大的值,Floor,int转换无法正常工作

时间:2013-01-23 10:34:28

标签: c++ int floor

我遇到了问题。在运行模拟之前,我在“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);
...

问题是现在。在我大学的PC上一切都很好,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'。

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

我感谢任何提示!谢谢!

1 个答案:

答案 0 :(得分:4)

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

例如,考虑精度的六位小数。当然,这不是double使用的,但概念完全相同。 1/3.333333,小数精度为六位数。因此30 * (1/3)9.99999。如果向下舍入为整数,则得到9,而不是10。这是你看到的问题。

如果您不想要此行为,请不要使用浮点。

向传递给floor的值添加一个小“delta”就足够了。