我已經登錄到缺陷數據庫,它已被認爲是應該在數天出現在Bugs Database一個新的bug。
這看起來像我在JIT編譯器中的錯誤。它檢測到我< =限制始終爲真(對於Integer.MAX_VALUE -1,這不會發生)併產生不正確的代碼。如果你運行以下。
public static void main(String[] args) {
for(int i=0;i<10;i++)
generate(Integer.MAX_VALUE);
for(int i=0;i<10;i++)
generate2(Integer.MAX_VALUE);
System.out.println("End of Main");
}
// generate primes.
public static void generate(int limit) {
int lastPrime = 0;
for (int i = 3; i <= limit; i += 2)
if (isPrime(i))
lastPrime = i;
System.out.println("1: Stopped generating at lastPrime= "+lastPrime);
}
public static void generate2(int limit){
int lastPrime = 0;
for (int i = 3; i <= limit; i += 2)
if (isPrime(i))
lastPrime = i;
System.out.println("2: Stopped generating at lastPrime= "+lastPrime);
}
// checking for primes
public static boolean isPrime(int n) {
double sqrt = Math.sqrt(n);
for (int i = 2; i <= sqrt; i++)
if (n % i == 0)
return false;
return true;
}
它打印
1: Stopped generating at lastPrime= 39367
1: Stopped generating at lastPrime= 55291
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 49603
2: Stopped generating at lastPrime= 2039
2: Stopped generating at lastPrime= 2039
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
End of Main
有沒有這樣的不變'Integer.Max_Value'你能張貼您的實際工作的代碼? – 2011-05-27 15:55:08
@Peter有一個constant..http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#MAX_VALUE – 2011-05-27 15:59:27
我注意到的第一件事情是,你調理'我<= limit'始終爲真,因爲該限制是最大可能的「int」值。 ;) – 2011-05-27 16:02:06