C ++为相同的算术表达式给出不同的错误结果
C++ is giving different wrong results for same arithmetic expression
我有一个非常简单的计算,我计算每个单独的单元格到二维中心的距离 space。我知道 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
这种行为的原因是什么?
对于编译器,我使用的 GCC 只有 -g 标志
生成相同结果的 CPP 在线编译器:https://www.onlinegdb.com/online_c++_compiler
提前致谢!
典型的int
(有符号32位)最多只能存储2,147,483,647(2**31 - 1
)。
当ii
大于46340时,ii*ii
的计算将超过此限制。
您正在为 result
使用 unsigned long long
,因此在计算之前转换为该值会改善行为。
#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;
}
我有一个非常简单的计算,我计算每个单独的单元格到二维中心的距离 space。我知道 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
这种行为的原因是什么?
对于编译器,我使用的 GCC 只有 -g 标志
生成相同结果的 CPP 在线编译器:https://www.onlinegdb.com/online_c++_compiler
提前致谢!
典型的int
(有符号32位)最多只能存储2,147,483,647(2**31 - 1
)。
当ii
大于46340时,ii*ii
的计算将超过此限制。
您正在为 result
使用 unsigned long long
,因此在计算之前转换为该值会改善行为。
#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;
}