查找二维矢量的总和
找到二维矢量的总和有些麻烦。这看起来好吗?查找二维矢量的总和
int sumOfElements(vector<iniMatrix> &theBlocks)
{
int theSum = 0;
for(unsigned i=0; (i < theBlocks.size()); i++)
{
for(unsigned j=0; (j < theBlocks[i].size()); j++)
{
theSum +=theBlocks[i][j];
}
}
return theSum;
}
它返回一个负数,但是,它应该返回正数..
希望有人能帮助:)
代码看起来是抽象的正确,但你可能会溢出theSum
。你可以尝试使theSum
类型double
看看你能得到什么价值来帮助理清适合它的整体类型。
double sumOfElements(vector<iniMatrix> &theBlocks)
{
double theSum = 0;
/* ... */
return theSum;
}
当你观察返回的值,你可以看它是否会适合在int
,或者如果你需要使用一个更广泛的long
或long long
类型。
如果矩阵中的所有值都是正数,则应考虑使用其中一个无符号整数类型。这会使您允许的值的范围加倍。
为什么使用double - 不会长或长long会更好(或者它们的无符号等价) – 2012-08-17 02:15:04
@AdrianCornish:它只取决于有多少溢出,以及有多大的东西被累加起来。 double是第一遍,如果可能的话,稍后用适当的整数类型替换。 – jxh 2012-08-17 02:16:23
同意 - 为此目的,它会没事 - 我有双打和漂浮在噩梦中,因为精确度和日常工作中的==比较,所以我讨厌他们;-) – 2012-08-17 02:21:08
我认为这可能是int溢出问题。为了确保,你可以在内部循环完成后插入一个条件来查看你的结果是否超出int范围。
if(result>sizeof(int))
cout<<"hitting boundaries";
更好的方法来测试,如果你超过INT界限内循环结束后,打印出结果并注意结果。
。如果是这样,只需使用更大的数据类型。
这不符合您的想法。 'sizeof(int)'以字节为单位返回'int'类型的大小。 – Blastfurnace 2012-08-17 04:45:16
此外,即使'sizeof'做了你所假设的,测试也不会通过,因为在超过最大可能值时,它会变成负值。 – jogojapan 2012-08-17 05:01:28
@Blastfurnace你是对的,我的意思是它确实超过了int的边界。 – 2012-08-17 11:41:16
就像Mokhtar Ashour说的那样,可能是变量theSum
溢出。尝试使unsigned
如果没有数字是负数,或将其类型从int
(即32位)更改为long long
(即64位)。
显然,问题的INT超过其边界(像其他人说)
对于签名的数据类型时溢出,并为无符号的数据类型从零溢出后重新开始变得消极。
如果您想实际检测到溢出,可以粘贴这些行而不是附加行。
if(theSum > int(theSum + theBlocks[i][j]))
//print error message, throw exception, break, ...
break;
else
theSum += theBlocks[i][j];
更多通用的解决方案有更多的数据类型,比除了更多的操作工作,检查:How to detect integer overflow?
一个解决办法是使用unsigned long long
如果超过其边界也一样,你需要使用第三大型图书馆。
有符号整数溢出的行为未定义。 – jxh 2013-11-12 14:55:52
什么是'iniMatrix',你期望结果符合一个有符号的int – 2012-08-17 02:07:54
矩阵的所有元素都是正的吗? – dasblinkenlight 2012-08-17 02:08:14
嘿,不是所有的值都是正值,但是,我正在使用的算法中的for循环。 @dasblinkenlight – Phorce 2012-08-17 02:38:38