2

我试图添加两个不同权重的数字。这是我的代码:

void onTimeStepOp::updatePointsType1_2(boost::tuples::tuple<float,int,int,int> &_prev,
                                     boost::tuples::tuple<float,int,int,int> &_result,
                                       boost::tuples::tuple<float,float> weights)
{
    _result.get<0>() = _result.get<0>() * weights.get<0>() + _prev.get<0>() * weights.get<1>();
    std::cout<<"deb:"<<(float)_result.get<2>() * weights.get<0>()<<" "<<(float)_prev.get<2>() * weights.get<1>()<<std::endl;
    _result.get<2>() = (int)((float)(_result.get<2>()) * weights.get<0>() + (float)(_prev.get<2>()) * weights.get<1>());
    std::cout<<"deb2:"<<(float)_result.get<3>() * weights.get<0>() <<" "<< (float)_prev.get<3>() * weights.get<1>()<<std::endl;
    _result.get<3>() = (int)((float)(_result.get<3>()) * weights.get<0>() + (float)(_prev.get<3>()) * weights.get<1>());
}

weights.get<0> = 0.3,weights.get<1> = 0.7。

我得到的输出如下所示:

resultBefore=36.8055 4 69 91 previousPPos=41.192 4 69 91
deb:20.7 48.3
deb2:27.3 63.7
resultAfter=39.8761 4 **68** 91

第三个数字应该是 69(69 * 0.3 + 69 * 0.7)。但是,它是 68。类型转换表达式有什么问题?

4

3 回答 3

2

转换为int截断,因此最轻微的舍入错误可能会导致您一败涂地。int您可能希望使用该函数,而不是直接转换为round

我可能会补充一点,这weights.get<0>肯定不是0.3,weights.get<1>当然也不是 0.7,因为 0.3 和 0.7 都不能用机器浮点表示(至少在你可能使用的任何机器上都不能表示)。

于 2012-11-21T13:19:43.697 回答
0

转换为int将导致点前的数字,所以68.1..68.9将全部68如前所述。另一种解决方案可能不是那么好,那就是在铸造之前增加0.5你的价值。将如此float,这将是静止的,但将是哪个将是。68.168.66868.56969

于 2012-11-21T13:28:17.567 回答
0

你应该round()而不是仅仅投射到int. 铸造会修剪小数点后的所有内容,由于舍入错误导致的数字可能类似于68.99999999991(只是一个例子,但给出了想法)。

于 2012-11-21T13:22:38.333 回答