std::accumulate使用的一个小细节
2024-10-18 07:42:57
今天使用std::accumulate
模板函数的时候出现了一个错误,特此记录一下。
#include <iostream>
#include <numeric>
int main()
{
int LevelColRow[][3] =
{
1, 2, 1,
2, 4, 2,
3, 8, 4,
4, 16, 8,
5, 32, 16,
6, 64, 32,
7, 128, 64,
8, 256, 128,
9, 512, 256,
10, 1024, 512,
11, 2048, 1024,
12, 4096, 2048,
13, 8192, 4096,
14, 16384, 8192,
15, 32768, 16384,
16, 65536, 32768 /*,
17, 131072, 65536/*,
18, 262144, 131072,
19, 524288, 262144*/
};
double xx = std::accumulate( std::begin( LevelColRow ), std::end( LevelColRow ),
0, [] (double val, int lcr[3]) { return(val + double(lcr[1]) * double(lcr[2]) ); } );
double xx2 = 0;
for ( auto x : LevelColRow )
{
xx2 += double(x[1]) * double(x[2]);
}
std::cout << (int64_t) xx << std::endl;
std::cout << (int64_t) xx2 << std::endl;
std::cout << "Hello, world!\n";
}
这个代码是用于求这个行列组总共有多少个格子的,但是算出的结果总是为负数。
经过排查,当格子数大于2^31
个时候,就出现问题了,这就应该是计算的结果实际是int32
的。
查看accumulate
(http://en.cppreference.com/w/cpp/algorithm/accumulate)的声明如下:
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
template< class InputIt, class T, class BinaryOperation >
T accumulate( InputIt first, InputIt last, T init,
BinaryOperation op );
那么原因就很简单了,因为我在使用的时候,第三个参数写的是0(默认为int),改为0.0
就可以了。
最新文章
- jquery 选择元素
- 修改Linux的SSH远程连接端口 技巧
- 烦人的win10的输入法
- [转]Membership三步曲之入门篇 - Membership基础示例
- 【Oracle】ORA-28000: the account is locked-的解决办法
- 处理畅捷通的T+ 12.0版,web服务无故自动停止的问题
- LoadRunner场景参数文件部分参数说明(我在某银行的整理)
- 文件写入文件分布式系统(asp.net C#)
- Emacs golang 配置
- 精通Linux的“kill”命令
- SQL Server Management Studio 使用作业实现数据库备份
- js控制TR的显示影藏
- JVM参数
- SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)
- vijos1057题解
- 永中DCS文档转换服务其它产品对比
- Unity发布WebGL时如何修改默认的载入进度条
- 带你深入理解STL之RBTree
- pd.read_csv() 、to_csv() 之 常用参数
- 初学Python——介绍一些内置方法