2012-11-21 50 views
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。类型转换表达式有什么问题?

回答

2

转换为int截断,所以最轻微的舍入错误可能会导致你一个。您可能需要使用功能round,而不是直接转换为int

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

+0

问题已解决。谢谢! – user957121

0

您应该round()而不是只是铸造到int。铸造修剪小数点后的所有内容,并且因舍入错误而产生的数字可能类似于68.99999999991(只是一个示例,但提供了这个想法)。

0

铸造到int会导致点之前的数字,所以68.1..68.9将全部为68如前所述。 另一种解决方案可能不是很好,那就是在投射前将0.5添加到您的float值。所以68.1将是68.6,这仍然是68,但68.569这将是69