首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ std::accumulate没有给出预期的总和

C++ std::accumulate没有给出预期的总和
EN

Stack Overflow用户
提问于 2010-08-31 05:46:06
回答 6查看 16.7K关注 0票数 47
代码语言:javascript
复制
double numbers[ ] = { 1, 0.5 ,0.333333 ,0.25 ,0.2, 0.166667, 0.142857, 0.125,
                       0.111111, 0.1 } ;
std::vector<double> doublenumbers ( numbers , numbers + 10 ) ;
std::cout << std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , 0 ) ;

这会产生1,这显然是错误的。有什么解释吗?

EN

回答 6

Stack Overflow用户

发布于 2010-08-31 05:51:02

您应该编写以下代码:

代码语言:javascript
复制
std::cout << 
 std::accumulate ( doublenumbers.begin( ) , doublenumbers.end( ) , 0.0 ) ;

因为0的类型是int

当使用第三个参数的类型为int实例化std::accumulate时,它将转换sum的右侧。例如:

代码语言:javascript
复制
   result += *iter;
// int    += double

这将强制将double转换为int,而不是您所想的相反。

票数 69
EN

Stack Overflow用户

发布于 2010-08-31 05:52:02

您使用0作为init参数调用accumulate,因此它将使用整数进行累加。请改用0.0

票数 9
EN

Stack Overflow用户

发布于 2015-04-24 23:50:54

std::accumulate将开始对作为第三个参数传递的类型求和,如果您传递一个整数,则返回类型将为int。并且在这种情况下隐式地转换为double

在C++11和C++14中,如果要防止缩小转换范围,可以使用直接列表初始化创建对象

代码语言:javascript
复制
double sum { std::accumulate(doublenumbers.begin(), doublenumbers.end(), 0) };

然后,编译器会给你一个警告,告诉你正在尝试从int转换到double,以及在哪一行。这将节省您的调试时间。你可以很容易地修复它,让它变得正确:

代码语言:javascript
复制
double sum { std::accumulate(doublenumbers.begin(), doublenumbers.end(), 0.0) };
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3604478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档