2012-08-22 19 views
11

Chương trình C++ dưới đây sẽ trả về giá trị dương. Tuy nhiên, nó trả về 0.Sản phẩm bên trong không sử dụng tiêu chuẩn std :: inner_product

Điều gì sẽ xảy ra? Tôi nghi ngờ một chuyển đổi int-double, nhưng tôi không thể tìm ra lý do tại sao và như thế nào.

#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

Chuckle. Điều đó đã giúp tôi một lần. –

Trả lời

13

Vì bạn đã cung cấp giá trị ban đầu là 0, một int. mã của bạn là trong nội bộ tương đương với:

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; 

Trong khi result + 0.5 * 0.5 tạo ra giá trị đúng (result được thăng double trong biểu thức này), khi giá trị được gán trở lại vào result, nó cắt ngắn (biểu hiện được đúc để int) . Bạn không bao giờ nhận được ở trên 1, vì vậy bạn thấy 0.

Thay vào đó, hãy đặt giá trị ban đầu là 0.0.

3

Điều này là do bạn đã cung cấp 0 làm hằng số nguyên. Các hoạt động kết quả là tất cả trong các số nguyên, vì vậy giá trị cuối cùng (0.75) cũng được cắt ngắn thành int.

Thay đổi số không đến 0.0 để làm cho nó làm việc:

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

này tạo 0.75 trên ideone.

+0

Trên thực tế, nó không bao giờ vượt quá 0,25 trước khi truncking trở lại không. Tôi đặt ra một từ. –

Các vấn đề liên quan