12

以下の C++ プログラムは、厳密に正の値を返す必要があります。ただし、 を返します0

何が起こるのですか ?int-double 変換が疑われますが、その理由と方法がわかりません。

#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;
}
4

2 に答える 2

15

の初期値を指定したため0int. あなたのコードは内部的に次のものと同等です:

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

于 2012-08-22T01:01:59.123 に答える
4

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

ゼロを次のように変更し0.0て機能させます。

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

これにより、 ideone が生成0.75されます

于 2012-08-22T01:00:40.607 に答える