Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过类型转换求和浮点数会失去精度_C++ - Fatal编程技术网

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