计算上限和下限时的奇怪错误

时间:2012-11-20 03:34:06

标签: c math

我的程序是多线程的。每个线程负责一定数量的数据。我正在做的是计算下限和上限然后通过结构将它们传递给线程函数。 lower_bound和upper_bound都是无符号整数。

主线程具有以下下限和上限。

lower_bound: 3;
upper_bound: (NUM/num_threads) - 1;

其他工作线程具有以下下限和上限。

lower_bound = (NUM * (i + 1))/(num_threads);
upper_bound = (NUM * (i + 2))/(num_threads) - 1;

NUM是我程序中定义的常量。我注意到该程序可以正常工作到一定数量级。 10 ^ 8工作正常,但10 ^ 9没有。为了调试我的程序,我让工作线程打印出它们的输出。

输出10个线程,最多10 ^ 8。

lower_bound: 10000000    upper_bound: 19999999
lower_bound: 20000000    upper_bound: 29999999
lower_bound: 30000000    upper_bound: 39999999
lower_bound: 60000000    upper_bound: 69999999
lower_bound: 70000000    upper_bound: 79999999
lower_bound: 50000000    upper_bound: 59999999
lower_bound: 80000000    upper_bound: 89999999
lower_bound: 40000000    upper_bound: 49999999
lower_bound: 90000000    upper_bound: 99999999

输出10个线程,最多10 ^ 9。

lower_bound: 100000000   upper_bound: 199999999
lower_bound: 200000000   upper_bound: 299999999
lower_bound: 300000000   upper_bound: 399999999
lower_bound: 70503270    upper_bound: 170503269
lower_bound: 170503270   upper_bound: 270503269
lower_bound: 270503270   upper_bound: 370503269
lower_bound: 370503270   upper_bound: 41006539
lower_bound: 41006540    upper_bound: 141006539
lower_bound: 400000000   upper_bound: 70503269

世界上发生了什么?

2 个答案:

答案 0 :(得分:2)

整数溢出。你有一个无符号的32位整数,最大值超过40亿。之后,它会再次出现并从零开始。

更改为使用64位整数(uint64_tunsigned long long)。

答案 1 :(得分:0)

你得到一个32位整数溢出。 4 * 10 ^ 9略小于2 ^ 32,但5 * 10 ^ 9更大。 (5 * 10 ^ 9 - 2 ^ 32)= 705032704.除以10然后丢弃剩余部分,得到70503270.减去1得到70503269,你会在结果中看到。