C++ 通过类型转换求和浮点数会失去精度
我尝试添加两个不同权重的数字。这是我的密码:C++ 通过类型转换求和浮点数会失去精度,c++,C++,我尝试添加两个不同权重的数字。这是我的密码: void onTimeStepOp::updatePointsType1_2(boost::tuples::tuple<float,int,int,int> &_prev, boost::tuples::tuple<float,int,int,int> &_result,
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>());
}
第三个数字应该是69(69*0.3+69*0.7)。然而,它是68。类型转换表达式有什么问题?到
int
的转换会截断,因此最轻微的舍入错误可能会导致您被截断。与其直接转换为int
,不如使用函数round
我可以加上
权重。get
肯定不是0.3,而权重。get
肯定不是0.7,因为0.3和0.7都不能用机器浮点表示(至少在您可能使用的任何机器上都不能表示)。您应该round()
而不是仅仅转换为int
。强制转换会在小数点后修剪所有内容,由于舍入错误而产生的数字可能类似于68.999999991
(只是一个示例,但给出了想法)。强制转换到int
将产生点前的数字,因此68.1..68.9
将全部是68
。
另一个解决方案可能是,这不太好,那就是在施法之前将0.5
添加到float
值中。所以68.1
将是68.6
,它仍然是68
,但是68.5
将是69
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