2

重みの異なる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

3番目の数値は69(69 * 0.3 + 69 * 0.7)である必要があります。ただし、代わりに68です。型変換式の何が問題になっていますか?

4

3 に答える 3

2

切り捨てへの変換int。わずかな丸め誤差により、1回限りになる可能性があります。に直接変換するのではなくint、関数を使用することをお勧めしますround

weights.get<0>0.3も0.7もマシンの浮動小数点で表現できないため、これは確かに0.3ではなく、0.7でもありませんweights.get<1>(少なくとも、使用する可能性のあるマシンでは)。

于 2012-11-21T13:19:43.697 に答える
0

にキャストするのではround()なくint、キャストは小数点以下のすべてをトリミングし、丸め誤差による数値は次のようになります68.99999999991(単なる例ですが、アイデアを示します)。

于 2012-11-21T13:22:38.333 に答える
0

にキャストするintと、ドットの前に数字68.1..68.9が表示されるため、すべて68前に記述したとおりになります。別の解決策は、キャストする前に価値0.5を高めることですが、それほど良くはありません。floatですから、これはまだですが、どちらに68.1なるでしょう。68.66868.56969

于 2012-11-21T13:28:17.567 に答える