1

我有一个非常简单的计算,我计算每个单独的单元格到二维空间中心的距离。我知道 O(n) 解决方案是多余的,我推导出了 O(1) 解决方案的公式。但我想了解的是:为什么这两个类似的计算会给我两个不同的结果?

这是 Python 中的预期(正确)结果(两个版本给出相同的结果):

result = 0;
n = 499993;
center = (n+1)//2;
for ii in range(1,center):
        result += (ii*ii*8);

print(result);

输出:

41664916690999888

这里有两个 C++ 版本,有两个完全不同的错误结果:

1)

#include <iostream>
using namespace std;
int main()
{
    unsigned long long result = 0;
    int n = 499993;
    int center = (n+1)/2;
    for(int ii = 1; ii < center; ++ii)
    {
        result += (ii*ii);
    }
    cout << result*8 << endl;
}

输出:

154435732281936
#include <iostream>
using namespace std;
int main()
{
    unsigned long long result = 0;
    int n = 499993;
    int center = (n+1)/2;
    for(int ii = 1; ii < center; ++ii)
    {
        result += (ii*ii*8);
    }
    cout << result << endl;
}

输出:

6229295798864 

这种行为的原因是什么?

对于编译器,我只使用带有 -g 标志的 GCC

产生相同结果的 CPP 在线编译器:https ://www.onlinegdb.com/online_c++_compiler

提前致谢!

4

1 回答 1

3

典型int(有符号 32 位)最多只能存储 2,147,483,647 ( 2**31 - 1)。

当大于 46340时,计算ii*ii将超过此限制。ii

您正在使用unsigned long longfor result,因此在计算之前强制转换将改善行为。

#include <iostream>
using namespace std;
int main()
{
    unsigned long long result = 0;
    int n = 499993;
    int center = (n+1)/2;
    for(int ii = 1; ii < center; ++ii)
    {
        result += (static_cast<unsigned long long>(ii)*ii); // add casting
    }
    cout << result*8 << endl;
}
于 2021-04-12T13:20:16.213 回答