我遇到了问题。在运行模拟之前,我在“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'。
有人知道这可以来自哪里吗?
我感谢任何提示!谢谢!
答案 0 :(得分:4)
这是有限精度表示的本质。
例如,考虑精度的六位小数。当然,这不是double
使用的,但概念完全相同。 1/3
为.333333
,小数精度为六位数。因此30 * (1/3)
是9.99999
。如果向下舍入为整数,则得到9
,而不是10
。这是你看到的问题。
如果您不想要此行为,请不要使用浮点。
向传递给floor
的值添加一个小“delta”就足够了。