总结浮点数会因类型转换而失去精度

时间:2012-11-21 13:16:13

标签: c++

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

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

3 个答案:

答案 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将为6969