我尝试添加两个不同重量的数字。这是我的代码:
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&℃,GT; = 0.3,weights.get&lt; 1&gt; = 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。类型转换表达式有什么问题?
答案 0 :(得分:2)
转换为int
截断,因此最轻微的舍入错误可能会导致您失败。您可能希望使用函数int
。
round
我可能会补充说weights.get<0>
当然不 0.3,weights.get<1>
当然不是0.7,因为0.3和0.7都不能代表机器浮点(至少不是在你可能正在使用的任何机器上。
答案 1 :(得分:0)
您应该round()
而不是仅仅投射到int
。转换修剪小数点后的所有内容,由于舍入错误导致的数字可能类似于68.99999999991
(仅作为示例,但提供了想法)。
答案 2 :(得分:0)
转换为int
会产生点前的数字,因此68.1..68.9
将是之前写的所有68
。
另一个解决方案可能是,不太好,就是在投射前将0.5
添加到float
值。因此68.1
将是68.6
,它仍为68
,但68.5
将为69
,69
。