地板,int 转换对于大值无法正常工作

Floor, int conversion is not working correctly for large values

本文关键字:常工作 工作 int 转换 于大值 地板      更新时间:2023-10-16

我遇到了一个问题。我在类"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",因为它应该有。在我的家用PC上,系统以某种方式返回了值"999"。如果我将 *T_desired 的值更改为"0.05",则在两台 PC 上都给出了正确的值"10"。

我已经检查过使用变量

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

这就是给出"1000"的正确解决方案。错误必须出在地板函数或内部转换中。如果我这样做

int k_end_test2 = (int)(k_end_test);

double k_end_test2 = floor(k_end_test);

结果始终为"999"。

有人知道这是从哪里来的吗?

我很感谢任何形式的提示!谢谢!

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

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

如果不希望此行为,请不要使用浮点数。

在您

传递给 floor 的值中添加一个小的"增量"可能就足够了。