我遇到了最奇怪的問題,並且一直在進行可怕的調試。我想我會在這裏發表意見。使用大數字的Eratosthenes算法Java Sieve時出現奇怪的數值錯誤?
public static void sieve(int limit) {
for (int i = 2; i < limit; i ++) {
if (mPrimes[i] == true) {
for (int j = i*i; ((j < limit) && (j > 0)); j += i) {
mPrimes[j] = false;
}
}
}
}
(假設mPrimes都是最初真)
這裏的漁獲:
當我運行此程序的10限額,100,1000,10000,甚至是100000,它報告計數正確的數字低於給定的數字,作爲與本頁面交叉引用:http://primes.utm.edu/howmany.shtml
但是,當我運行的參數1000000(一百萬),我得到一個結果是正好7離正確價值(它報告78491英寸tead of 78498)。
此外,我在本程序中實施的所有其他素數計數方法都報告了正確的值。
這裏是真正的陷阱:如果我有
i+i
至於開始直接從種子值「劃掉」,而不是從廣場開始取代
i*i
(這是我的教授在他的示例代碼中所做的),它的工作原理。
這讓我只能假設當我非常大時,廣場上發生了一些奇怪的事情。
有什麼建議嗎?
你試過使用long而不是int嗎? http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – 2012-01-28 06:18:41
沒有理由在你的第二個陳述中加入'j> 0'。由於j是i的平方,它總是大於0,所以j總是大於0. – 2012-01-28 21:25:18
是的,這實際上是因爲相同錯誤而導致的先前修復(i * i溢出並創建-2^31,仍然是通過了<極限測試)。我可以刪除,現在我已經修復了問題 – cemulate 2012-01-29 07:28:09