2012-11-21 92 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