2012-08-22 9 views
11

以下のC++プログラムは、厳密に正の値を返します。ただし、0を返します。std :: inner_productを使用すると内積がゼロになる

どうしますか?私はintダブル変換を疑うが、私は理由と方法を理解することはできません。

#include <iostream> 
#include <vector> 
#include <numeric> 
using namespace std; 
int main() 
{ 

    vector<double> coordinates; 
    coordinates.push_back(0.5); 
    coordinates.push_back(0.5); 
    coordinates.push_back(0.5); 

    cout<<inner_product(coordinates.begin(), coordinates.end(), coordinates.begin(), 0)<<endl; 

    return 0; 
} 
+3

チャックル。それは私にも一度も気付いた。 –

答えて

13

0という初期値を指定しているので、intを指定しました。あなたのコードでは、と内部等価です:

int result = 0; 

result = result + 0.5 * 0.5; // first iteration 
result = result + 0.5 * 0.5; // second iteration 
result = result + 0.5 * 0.5; // third iteration 

return result; 

result + 0.5 * 0.5が正しい値(resultはこの式でdoubleに昇格される)を生成するが、その値がresultに戻って割り当てられている場合、(式がintにキャストされていることを)切り捨てられています。 1を超えることはありませんので、0と表示されます。

代わりに0.0の初期値を指定します。

3

これは、整数定数としてゼロを指定したためです。結果の演算はすべて整数であるため、最終値(0.75)はintに切り捨てられます。それを動作させるために0.0

変更ゼロ:

cout << inner_product(coord.begin(), coord.end(),coord.begin(), 0.0) << endl; 

これはideone0.75を生成します。

+0

実際には、0.25に達してからゼロに戻ることはありません。私は言葉を作った。 –

関連する問題