今天使用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就可以了。

std::accumulate使用的一个小细节的更多相关文章

  1. C++在使用Qt中SLOT宏须要注意的一个小细节

    大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类假设覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但假设指针去调用非虚函数,这个时候会调用C++的静态绑定,去推断当前的指针是 ...

  2. C++在使用Qt中SLOT宏需要注意的一个小细节

    大家都知道C++虚函数的机制,对于基类定义为虚函数的地方,子类如果覆写,在基类指针或者引用来指向子类的时候会实现动态绑定. 但如果指针去调用非虚函数,这个时候会调用C++的静态绑定,去判断当前的指针是 ...

  3. [20171120]bash使用here documents的一个小细节.txt

    [20171120]bash使用here documents的一个小细节.txt --//昨天看bash文档,,发现一些小细节,做一个记录,就是EOF加引号的问题. command <<' ...

  4. 文本域textarea的一个小细节

    文本域代码在编写时,最好写在一行上,就像: 如果没写在一行上,如: 那么就会在后续生成的页面上输入的时候就会产生一段空白无法删除: 这是写文本框的时候的一个小细节

  5. 关于 JavaScript 中一个小细节问题 (在控制台中直接 {Name:'王尼玛',Age:20} 对象报错问题)

    在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚 ...

  6. 关于base64的一个小细节

    Base64出现\r\n的问题 前段时间遇到这么一个小问题: 后台接口返回一个图片的base64串,同事拿着这个字符串,找了一个在线图片和Base64字符串互转的工具网站,想将字符串转成图片,死活转不 ...

  7. 曲演杂坛--使用TRY CATCH应该注意的一个小细节

    群里一个朋友遇到一个TRY CATCH的小问题,测试后发现是自己从来没有考虑的情况,写篇blog加深下印象 --============================================ ...

  8. 使用Spring和SpringMVC管理bean时要注意的一个小细节

    最近一直在做毕业设计...用到了Shiro和SpringMVC..用过shiro的朋友都知道shiro需要自己去写Realm,然后把Realm注入到SecurityManager中.而Security ...

  9. List<Integer>.remove()的一个小细节

    不废话,先上代码: ArrayList<Integer> col = new ArrayList<Integer>(); System.out.println("In ...

随机推荐

  1. yolo源码解析(三)

    七 测试网络 模型测试包含于test.py文件,Detector类的image_detector()函数用于检测目标. import os import cv2 import argparse imp ...

  2. MySQL 锁模式

    InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks an ...

  3. JAVA中String.format的用法 转16进制,还可以补0

    1.对整数进行格式化:%[index$][标识][最小宽度]转换方式        我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解, ...

  4. CF 329A(Purification-贪心-非DLX)

    A. Purification time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. jquery实现上传文件大小类型的验证

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. JQuery Ajax 在asp.net中使用总结

    自从有了JQuery,Ajax的使用变的越来越方便了,但是使用中还是会或多或少的出现一些让人短时间内痛苦的问题.本文暂时总结一些在使用JQuery Ajax中应该注意的问题,如有不恰当或者不完善的地方 ...

  7. 基于单个 div 的 CSS 绘图

    为什么只使用一个 Div? 2013年5月,我参加了 CSSConf,看到了Lea Verou 关于 border-radius 的演讲,你可能会认为这个属性很不起眼.但是这个演讲让我大开眼界,认识到 ...

  8. Lucene学习——IKAnalyzer中文分词

    一.环境 1.平台:MyEclipse8.5/JDK1.5 2.开源框架:Lucene3.6.1/IKAnalyzer2012 3.目的:测试IKAnalyzer的分词效果 二.开发调试 1.下载框架 ...

  9. Hibernate缓存应用的积累与总结

    Hibernate缓存一直比较难掌握,下面就分析和总结原因,相信你就会慢慢清楚了原来Hibernate缓存也是可以轻松掌握的,但前提要求大家必须跟着动手去验证一下,再用心体会,光看是没有用的 目录: ...

  10. R-向量